`
bingzhen66
  • 浏览: 36616 次
文章分类
社区版块
存档分类
最新评论

35.黑马程序员-线程间通信(生产者消费者)

 
阅读更多

------- android培训java培训、期待与您交流! ----------

生产者消费者例子
  • 生产者消费者例子:有多个生产者、多个消费者同时操作资源
1.Java1.5版本以前的生产者消费者例子
    • 多个(大于2个)线程同时操作资源会出现以下几种问题
      • 多个资源只消费了少数。
      • 一个资源同时消费了多次。
    • 产生原因
      • 原因1就是线程唤醒时,可能唤醒本身线程,导致数据错乱:多次生产、多次消费。
      • 原因2就是if判断标记时,if判断了一次后线程wait,被唤醒后没有判断标记。
    • 解决方法
      • 解决原因1就是把唤醒(notify),改为唤醒全部(notifyAll),唤醒全部。
      • 解决原因2就是用while判断标记,while可以保证线程每次被唤醒都会重新判断标记。
      • 两个方法必须同时进行。
      • 关键字:notifyAll唤醒所有线程,while每次唤醒都判断标记。
    • 2.代码如下
2.Java1.5版本提供了多线程升级解决方案
    • 将同步synchronized替换成了显式Lock操作。
    • 将Object中的wait,notify notifyAll,替换成了Condition对象。该对象可以通过Lock锁进行获取。Lock替代了synchronized方法和语句的使用,Condition替代了 Object 监视器方法的使用
      • 一个锁里可以有多个Condition,代表多个线程。
      • 该示例实现了只唤醒对方,而不是全部唤醒。



    • 1.5版本多线程新特性:显式的锁机制,以及显式的锁机制上的唤醒、等待机制。一个锁对应多个Condition。



    • 定义锁、定义锁的两个Condition、定义资源的set方法 代码如下
      • 注意:释放锁的finally一定要执行。
    • 为什么Lock不会死锁。
    • 因为Lock只有一个锁,当然不会死锁。
      condition只是一个条件,这个条件可以认为是一个标记,具体是通过代码实现的。
      condition是一个接口,通过Lock的newCondition与Lock绑在一块。
      一个锁可以绑多个condition。
      一个锁有多个条件,每个条件下面有多个线程,可以精确处理这个条件下的线程,让他们等待、唤醒等。

      synchronized就不可以,因为它的等待、唤醒等都是使用的Object的方法,处理很粗糙。
      才会出现同时唤醒所有,同时等待所有的情况,不能分条件处理。

      condition很抽象,它不是自然事物,而是一种代码控制手段。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics