黑马程序员技术交流社区

标题: 在毕老师讲的多线程1.5升级那里,有个关于Lock和Condition的... [打印本页]

作者: ☆星痕泪    时间: 2013-10-1 15:11
标题: 在毕老师讲的多线程1.5升级那里,有个关于Lock和Condition的...
本帖最后由 ☆星痕泪 于 2013-10-1 17:04 编辑

说重点:这是关于多线程消费者和生产者1.5升级那段疑惑,里面讲到lock和condition相当于代替和升级了synchronized和notify。
但是我对这段代码最后三句的实现过程还是很模糊,能帮忙理一下吗?小弟不胜感激!

  1. <DIV class=blockcode>
  2. <BLOCKQUOTE>class Resource //创建一个资源
  3. {
  4. private String name;
  5. private int number = 1;
  6. private boolean flag = false;
  7. private Lock lock = new ReentrantLock();
  8. private Condition condition_pro = lock.newCondition();
  9. private Condition condition_con = lock.newCondition();
复制代码
晕,吐下槽。放假这网速是比老乌龟还慢,这验证码老是出错。






作者: lizhangzhi    时间: 2013-10-1 15:28
Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。

Condition 实例实质上被绑定到一个锁上。要为特定 Lock 实例获得 Condition 实例,使用其 newCondition() 方法。

作者: ☆星痕泪    时间: 2013-10-1 15:39
lizhangzhi 发表于 2013-10-1 15:28
Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象 ...

我还是有点模糊,它最后两句的实现过程我还是不清楚。

作者: ←佐手邊の永远    时间: 2013-10-1 16:03
最好两行就是实现了两个Condition,就相当于有了两个wait(),notify()以及notifyAll()
作者: lizhangzhi    时间: 2013-10-1 16:08
只要是锁就有操作锁的方法,lock的方法wait、notify 和 notifyAll全部都封装到condition中,要操作锁就要获得condition实例,并且可以实例多个condition对象,就是说,一个锁可以有多组监视器方法(如 wait、notify 和 notifyAll),每个condition对象又可以与任意锁进行组合,
作者: ←佐手邊の永远    时间: 2013-10-1 16:15
←佐手邊の永远 发表于 2013-10-1 16:03
最好两行就是实现了两个Condition,就相当于有了两个wait(),notify()以及notifyAll() ...

用Condition_pro.await()放在生产者代码中时,当执行到这一步,则生产者线程处于冻结状态,然后用消费者线程中的Condition_pron.signal()来唤醒这个线程,这样就可以指定唤醒对方的,不知道这样理解对不对,也想请大神指点一下

作者: 陈钦涛    时间: 2013-10-1 16:39
用大白话说说哈,在多线程执行的代码中,多个线程其中一个进入被锁住的代码时,另外的线程没有锁就进不了,第一个线程噼里啪啦执行完后处于等待状态await()了,但等待之前它想把其他多个线程(都是睡着的)中的指定的一个叫醒signal(),但怎么跟那个线程通讯呢?就是用Conditon对象,那个要被叫醒线程是被Condition1的await方法搞成等待状态的,那么我就用Conditon对象中的signal方法叫醒它。说得不严谨,但大概意思还是说出来了。。
作者: ☆星痕泪    时间: 2013-10-1 16:57
陈钦涛 发表于 2013-10-1 16:39
用大白话说说哈,在多线程执行的代码中,多个线程其中一个进入被锁住的代码时,另外的线程没有锁就进不了, ...

O(∩_∩)O~谢谢。
作者: ☆星痕泪    时间: 2013-10-1 17:00
←佐手邊の永远 发表于 2013-10-1 16:15
用Condition_pro.await()放在生产者代码中时,当执行到这一步,则生产者线程处于冻结状态,然后用消费者 ...

谢谢,非常简洁。是的。
作者: ☆星痕泪    时间: 2013-10-1 17:03
lizhangzhi 发表于 2013-10-1 16:08
只要是锁就有操作锁的方法,lock的方法wait、notify 和 notifyAll全部都封装到condition中,要操作锁就要获 ...

O(∩_∩)O哈哈~,灰常感谢。看了视频几遍,就是那里没搞清楚
作者: 赖龙威    时间: 2013-10-1 17:13
因为synchronized里用notifyAll()方法会把自己方的线程唤醒.java工程师就想到了用Lock和Condition的方法来代替synchronized方法。notifyAll()这个方法来至于锁。所以Condition也应该来至于Lock。就有了最后两句




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2