眼看下面这段不起眼的小程序,很简单,很单纯。似曾相识,却又不太一样。吃透它,细心体会其中的每一个细节。废话不多说。上代码!
记录每一天,先来一段插曲描述一下,程序后还有分析与思考:
用四个线程实现,两个生产者生产产品后,另两个消费者消费。要求生产一个产品必须先消费才能再生产下一个商品。
分析:生产者与消费者之前有共享资源(产品);且有多个线程(两个生产者与两个消费者)参与其中;生产者生产过程和消费过程都会使用到产品。以上三点,可以判断整个过程会引发安全隐患。我只需将双方使用产品的过程进行同步实现即可解决这个问题,这个安全隐患。
来吧,程序代码如下:
为实现同步,加入同步函数后发现。程序并达到没有预期的要求(产品必须先消费才能再生产下一个商品)。为达到这个目的,首先分析问题所在。经验证发现在使用产品过程中,同步函数监视器(锁)只能监视共同使用一个监视器的进程才有效,即无法监视具有不同监视器的对象。所以会导致程序中t1和t2对象判断语句判断后停留在那里,这样还会带来安全隐患。因此,为了达到多次判断,我们选择使用while循环语句。当然,引入while循环语句会带来程序停留的问题,不过使用Objec中的唤醒机制中的notifyAll完美解决了这个问。其中,一定要注意使用notify唤醒为什么会程序停留,因为其唤醒的只是池中的第一个进程。这样不难分析,其中生产者与消费者会多次使用产品的问题,而不是目标所要求的。
小小总结:要是有时间用思维导图体现,那就很Nice了。每天只24个小时,加油!
|
|