问答详情
源自:4-4 Java线程交互之深入剖析互斥与同步

lockObj.notifyAll(); 说是唤醒所有在lockObj对象上等待的线程,energyBoxes[from] < amount那么肯定会出现有些线程这个条件不满足的啊,咋能唤醒全部线程呢?

lockObj.notifyAll(); 说是唤醒所有在lockObj对象上等待的线程,energyBoxes[from] < amount那么肯定会出现有些线程这个条件不满足的啊,咋能唤醒全部线程呢?

提问者:GHW108 2018-06-04 11:41

个回答

  • 慕移动9181930
    2022-03-25 00:08:56

    偏执吧。。。AnimalDogAnimal

  • 好哲
    2020-06-09 15:41:38

    唤醒线程之后 线程就会重新执行一遍run语句块中的方法 而运行的代码中的“ while (energyBoxes[from] < amount)”代码就可以起到判断的作用 若不满足条件则继续等待

  • weixin_慕哥5569960
    2020-05-13 13:14:06

    wait()在条件不满足时调用,然后会释放掉锁,进入wait set等待,让其他的线程去竞争cpu资源,当其他的线程操作引起条件的变化时,则会notifyAll()唤醒所有在wait set中等待的线程,重新判断条件是否满足,满足则获取资源,不满足继续进入wait set等待

  • daniel_wlh
    2019-04-24 20:29:42

    没错,所有waitSet中的线程都会被唤醒,并且同一时刻只有一条线程竞争到CPU资源,

    然后开始执行transfer方法:如果还是不满足if条件,继续回去等待;满足了就执行transfer操作。

    然后下一个线程刚被唤醒的线程继续进入CPU。

  • 慕田峪609280
    2019-01-16 14:27:30

    不满足这个条件就不会wait(),所以就不需要唤醒啊

  • qq_星辰_17
    2018-11-28 17:56:10

    唤醒所有线程,然后重新进行一次判断,不满足的再次进入阻塞

  • 惨的一
    2018-09-26 14:19:58

    我猜是,energyBoxes[from]<amount的线程在失去锁进入wait set后,线程本身没有停下来只是不能操作被锁的内存区域,但是线程能获得新的amount(等于刷新自己的amount),也不知道对不对


  • qq_Passenger_12
    2018-06-04 16:55:34

    就像生产车间的库存商品一样,存货不足时买家来进货就只能进入等待,刚生产一件又有另外一个买家来进货,又只能进入等待,直到收到通知有货了买家才来买。这里的notifyAll就是通知了所有人