[TOC] 常量池之后,接上篇分析
public class ByteCodeTest1 {
private int a = 1;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
前三种是默认的三种类加载器,他们分别负责加载不同路径下的class文件;如下:
在并发场景中我们经常会看到volatile的身影,它到底能解决哪些问题?
wait/notify实现生产者消费者
线程的协作机制wait/notify,线程除了有竞争关系,他们还存在着协作,下面我们就用实际案例来描述下他们的协作关系
消费者、生产者是通过一个缓冲区进行通信的,这个缓冲区可以是阻塞队列;
生产者在队列满的时候停止生产;
消费者在队列空的时候停止消费;
生产者/消费者模型可以提高程序执行效率,我们可以调节生产者、消费者的个数来达到处理速度的平衡,提高资源利用率;
还有一个重要的特性,可以解耦,对于耦合性强的程序,我们可以通过这种方式进行解耦处理,当然现在各种mq很多,也是利用了这个思路来完成解耦;
研究wait/notify底层机制也有段时间了,今天我不打算从jvm层面说的太多,因为这这个完全可以开个章节,很多东西可以聊。我们都知道这是Object提供的三个方法,经常被忽视,或者我们很多时候压根用不到。但是了解它的精髓对我们了解并发这一块知识会有很大的帮助。
既然说到Object的方法,那肯定是每个对象都有,为什么?因为它在jvm层面是跟ObjectMonitor息息相关,这个类就是承载我们对象监视器的地方,也就是每个对象都有一把锁。现在不需要知道太多,但是有两点我希望你们可以明白,第一个执行wait的线程在waitSet(等待池),被唤醒的线程在entrySet(姑且叫锁池吧);下面开始撸代码.