为了账号安全,请及时绑定邮箱和手机立即绑定

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

http://img1.sycdn.imooc.com//566780920001874810490447.jpg

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

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

正在回答

2 回答

不会,主要是这样的:

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

0 回复 有任何疑惑可以回复我~

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


1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信