怎样用Java线程wait/notify实现高效率的生产者消费者?
lock free了,你用这种wait,notify的方式就是传统lock的方式,这样做高效不了
你应该看看actor model,eventloop这些东西,从vert.x开始是一个很好的切入口
lock应该减少,lock多就是低效的代名词
■网友
题主这个代码问题很多:
首先题主真的了解生产者消费者模式吗?
生产者消费者模式指的是有一个线程负责生产,另一个线程负责消费。而你的代码中是一个线程先调用生产方法生产,然后在调用消费方法消费。既然是同一个线程,根本就不需要加锁同步。还有你的代码中produce方法里是死循环,所以consume方法永远得不到执行。
然后再说说锁吧,先假设你是按照这个模式来的:一个线程调用produce方法生产,另一个线程调用consume方法消费。
锁的作用是用来实现线程间同步的。直白的说就是,当多个线程对同一共享资源发起操作时,让这多个线程进行排队,轮流着来的。当然这里得强调,这里说的是独占锁,不是共享锁。因为synchronized是实现的是一个独占锁,所以排除共享锁不谈了。
在你的代码例子中,这个共享资源就是products对象。由于生产者线程进行生产时加的是consumerLock锁,而消费者线程消费时加的是produceLock锁,生产者、消费者线程分别加了不同的锁,所以都能加锁成功,从而对products进行操作。所以说即便是不报错,你的代码也无法实现线程同步的效果。
所以我觉着是题主对加锁理解不到位的问题,与是Java还是linux c无关。不管什么平台,加锁的思路是一致的。
最后说说性能问题吧
锁(独占锁)本来就是用来实现多个线程对同一资源进行排队访问的,肯定会降低并发度,从而影响执行效率,这是不可避免的,不管什么平台下。要想优化提高效率只能从这几个方面入手:
①尽量减少加锁的粒度,从而减少了线程间抢占锁的几率,比如ConcurrentHashMap就是这个思路
②尽量避免线程进行锁等待时挂起的几率,比如线程锁等待时,先进行一定时间的自旋,从而避免了线程挂起唤醒的开销。现在Java的synchronized和并发包里的Lock都有这个优化。
■网友
【怎样用Java线程wait/notify实现高效率的生产者消费者?】 这代码搞笑了....这是单线程不是多线程,单线程搞个啥生产消费,消费生产都是同一个线程,这代码永远都是仓储类自己在生产。。。况且你produce方法里拿到的是consume的锁,但是你释放的是produce的锁,这代码不会抛异常吗???
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 互联网怎样解决“家政服务上门速度慢”的问题
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 怎样进入通信行业
- 怎样评价扶他柠檬茶的小说《云养汉》的结尾
- 怎样成为一名合格的Python程序员?
- 怎样评价华为、诺基亚、中兴中标中国移动高端路由交换设备扩容集采
- 怎样评价类似前橙会、百老汇、南极圈这样类型的离职帮抱团,对企业的积极意义和消极意义
