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

用notifyAll()的话,不是会造成数据出错么?

5482850d0001d00905000213.jpg


假设A、B线程的from都一样,energyBoxes[from]<amount导致A、B线程都wait()了。当满足energyBoxes[from] >= amount后某线程调用了notifyAll(),A、B线程都会继续运行,都对energyBoxes[from]进行操作,这样不是会导致数据出错么?

提问者:开眼看世界 2014-12-06 12:31

个回答

  • Arthur
    2014-12-06 17:35:31

    唤醒后还是要竞争锁的,所以访问时还是互斥的。

  • 开眼看世界
    2014-12-06 13:04:27

    是我理解错了,notifyAll()后还是会逐个运行,不会一起向下运行造成数据出错。

    个人估计notifyAll()在遍历wait set中的线程进行逐个唤醒时,应该还会用synchronized(this)互斥,不知是不是?