Java 线程间的通信 -- 生产者消费者模型 Auth o r: 若水三千 Email: sshi1984@126.com
What we call human nature is actually human habit
.
Java 线程间的通信 ---- 生产者消费者模型
Java 的线程间的通信主要是靠共享对象, 但是如何保证该对象一个时刻只能有一个线程来 访
问,这就需要线程间的同步,并且要用到线程间的通信。利用线程间的通信主要是因为当 多
个线程同时对一个对象进行访问的时候, 多个线程之间是一个协助的关系, 举个例子就是 今
天要说的生产这和消费者模型。 在这个模型中生产者主要是产生数据, 而消费者就是要获 取
(消耗)到生产者所产生的数据。生产者每产生一个新的数据的时候消费者就及时的消耗 掉
生产者所产生的数据,先看一下这个程序模型运行的结果:
从结果里面可以看到生产者每次产生一个数据的时候消费者都及时的消费掉生产者生产的
数据。在开始学习它的源码前先要弄清楚几个概念:
对象锁标志:所谓的锁就是把一个对象锁起来,每一次只能有一个线程
对她进行访问。在这锁机制里面其他的线程是无法操作该
对象的,更值得注意到是在 Java 中的每个对象中都有这么
一个隐藏的锁对象,无论是你自定义的还是 JDK 所带有的
Java 对象,都有这个锁标志,只不过在一般的方法中很少用
到,所以比较陌生,但是在你调用 notify() 和 wait() 实际上就
是在隐式的在操作该对象锁标志。
监控器:其实这个对象锁标志是同样的意思,也是一个隐式的同步机制。
当调用 notify() 和 wait() 方法的时候该监控器会自动的将识别对象
锁标志所在的线程,当某个占有了对象锁标志的线程释放了对象
锁标志的时候,监控器会通知其他等待的线程来争抢该对象锁标
志。
上面的两个概念只是在同步的方法中才会用到,一般的方法中它们都是一个隐式的方法,
JVM 是不会对它们做处理的。当使用了 synchroniz ed 的时候 JVM 才会在后台隐式的调用 这
两种机制, 来使对象的数据保持一致。 现在来看一下生产者和消费者模型的程序流程 (见
图) :
通过流程图可以对整个的生产者和消费者的程序模型有个大致的了解了, 现在看一下这个 测
试程序中每个类的作用:
Q :相当于一个仓库,里面存放的就是生产者产生的数据(消费者消耗掉数据) 。
Producer :即生产者,产生消费者需要的数据。
Consumer :即消费者,消耗掉生产者产生的数据。
PC :测试程序的主程序。
......
Producer Put :14428
Consumer Got :14428
Producer Put :14429
Consumer Got :14429
Producer Put :14430
Consumer Got :14430
......