GHW108
2018-06-04 11:41
lockObj.notifyAll(); 说是唤醒所有在lockObj对象上等待的线程,energyBoxes[from] < amount那么肯定会出现有些线程这个条件不满足的啊,咋能唤醒全部线程呢?
唤醒线程之后 线程就会重新执行一遍run语句块中的方法 而运行的代码中的“ while (energyBoxes[from] < amount)”代码就可以起到判断的作用 若不满足条件则继续等待
wait()在条件不满足时调用,然后会释放掉锁,进入wait set等待,让其他的线程去竞争cpu资源,当其他的线程操作引起条件的变化时,则会notifyAll()唤醒所有在wait set中等待的线程,重新判断条件是否满足,满足则获取资源,不满足继续进入wait set等待
没错,所有waitSet中的线程都会被唤醒,并且同一时刻只有一条线程竞争到CPU资源,
然后开始执行transfer方法:如果还是不满足if条件,继续回去等待;满足了就执行transfer操作。
然后下一个线程刚被唤醒的线程继续进入CPU。
不满足这个条件就不会wait(),所以就不需要唤醒啊
唤醒所有线程,然后重新进行一次判断,不满足的再次进入阻塞
我猜是,energyBoxes[from]<amount的线程在失去锁进入wait set后,线程本身没有停下来只是不能操作被锁的内存区域,但是线程能获得新的amount(等于刷新自己的amount),也不知道对不对
就像生产车间的库存商品一样,存货不足时买家来进货就只能进入等待,刚生产一件又有另外一个买家来进货,又只能进入等待,直到收到通知有货了买家才来买。这里的notifyAll就是通知了所有人
深入浅出Java多线程
186088 学习 · 464 问题
相似问题