lock版的生产者消费者
亲测,用synchronized和wait,notify加标志位也是实现的顺序执行,这是标志位的作用控制的,跟condition没关系
确实可以只用一个Condition因为这里while条件已经限制了顺序
能发挥多核cpu优势
当生产线中不同环节需要不同数量的线程数执行,就有用了,自己品。扩展思维
一个condition就行的,会有通知丢失的,实验过再发言
亲测敲代码验证,老师这里确实不对,他是用标志位控制为控制的,亲测标志位可以控制,JUC三个condition可以控制,只用一个condition也可以控制
结论:
关键字synchronized与wait()和notify()/notifyAll()方法相结合可以实现等待/通知模式,类ReentrantLock也可以实现同样的功能,但想要借助于Condition对象。Condition类是再JDK5中出现的技术,使用它有更好的灵活性,比如实现多路通知功能,也就是再一个Lock对象里面可以创建多个Condition(即对象监视器)实例,线程对象可以注册在指定的Condition中,从而可以有选择性地进行线程通知,在调度上更加灵活。
在使用notify()/notifyAll()方法进行通知时,被通知的线程却是由JVM随机选择的。
但使用ReentrantLock结合Condition类是可以实现前面介绍过的选择性通知,这个功能是非常重要的,而且在Condition类中是默认提供的。
而Synchronized就相当于整个Lock对象中只有一个单一的Condition对象,所有的线程都注册在它一个对象的身上。
线程开始notifyAll()时,想要通知所有的WAITING线程,没有选择权,会出现相当大的效率问题。
condition接口提供了类似Object的监视器的方法,用来实现等待通知模式。但是与Object监视器又有一定的区别,与不同。主要体现在;
等待队列
Obejct模式 :一个
Condition:多个
等待超时模式
Object模式:不支持
Condition模式:支持