老家伙
2015-12-09 09:17
我加了些注释,观察了下。wait的线程在收到notifyAll时,没有重新竞争锁,而是从wait()后开始执行的。那么,严格来讲,是否存在多个线程会同时执行后面代码的可能?
【本例不会出现是因为每次转移只转移给了一个节点,如果转移给两个节点或以上。则可能在wait后,同时有两个节点满足条件,则会出现竞争的情况。】
不会,主要是这样的:
先明白两个概念:锁池和等待池。synchronized是锁池,wait、notify、notifyAll是等待池。等待池的对象是不会竞争锁的,当notifyAll后,等待池中的线程会被唤醒进入到该线程的锁池中重新竞争对象锁,重新获得锁后的对象会从wait后继续执行代码,其他对象会被阻塞,而不是wait。被阻塞的对象会等待下一次被唤醒(notify、notifyAll)。另外,notify不是线程安全的,notifyAll才是。
确实是没有重复执行,我在wait后加了个outwait操作,out输出后加了sleep操作。并验证了,每个out后面都一定是该线程继续执行,而没有出现多个out并排的情况。。说明唤醒的现场还是先做了一次锁竞争,再执行的。其他的都在竞争外,等待执行
深入浅出Java多线程
186088 学习 · 464 问题
相似问题