问答详情
源自:4-1 Java线程交互之汽车人之忧:消失的能量

lockObj.wait()是否会打破锁,打破原子性?

http://img.mukewang.com/566780920001874810490447.jpg

我加了些注释,观察了下。wait的线程在收到notifyAll时,没有重新竞争锁,而是从wait()后开始执行的。那么,严格来讲,是否存在多个线程会同时执行后面代码的可能?

【本例不会出现是因为每次转移只转移给了一个节点,如果转移给两个节点或以上。则可能在wait后,同时有两个节点满足条件,则会出现竞争的情况。】

提问者:老家伙 2015-12-09 09:17

个回答

  • sxian_wang
    2015-12-09 12:12:34
    已采纳

    不会,主要是这样的:

    先明白两个概念:锁池和等待池。synchronized是锁池,wait、notify、notifyAll是等待池。等待池的对象是不会竞争锁的,当notifyAll后,等待池中的线程会被唤醒进入到该线程的锁池中重新竞争对象锁,重新获得锁后的对象会从wait后继续执行代码,其他对象会被阻塞,而不是wait。被阻塞的对象会等待下一次被唤醒(notify、notifyAll)。另外,notify不是线程安全的,notifyAll才是。

  • 老家伙
    2015-12-09 12:52:34

    确实是没有重复执行,我在wait后加了个outwait操作,out输出后加了sleep操作。并验证了,每个out后面都一定是该线程继续执行,而没有出现多个out并排的情况。。说明唤醒的现场还是先做了一次锁竞争,再执行的。其他的都在竞争外,等待执行