请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

notify和wait的疑惑

objectA.notifyAll()这行代码,到低是会将

(1)

synchronized (objectA){

   objectA.wait();
}

    持有所有由l于objectA.wait()而阻塞的线程激活。


(2)将由于没抢到synchronized (objectA)锁而Block的线程激活。


(3)还是说能将由于sleep而阻塞的线程激活?

    这两天学的有点多,思路不是很清楚,望见谅。。。


我的理解是这样,

    首先(2)这类阻塞是由于线程没抢到synchronized锁导致的Block阻塞,所以唯一能够解锁的方法就是抢到锁。和notify无关。

    A.notify只能唤醒由于A.wait()方法导致的阻塞。而A.notify和A.wait两个对象方法,之所以都要放到synchronized(A)的静态代码块里,是由于若没有放在锁里面,会导致一个线程准备wait的时候CPU调度到notify线程上,然后wait就一直无限等待。所以java设计设设计A.notify和A.wait两个对象方法,都要放到synchronized(A)的静态代码块里。本身notify和wait也是两个线程间的协同工作。

    而唤醒由于sleep方法导致休眠的线程只有两种。要么等sleep(100)中的时间过完,要么在其他线程中对本A线程进行A.interrupt操作,然后在sleep的业务代码中响应这个异常。





正在回答 回答被采纳积分+3

1回答

悟空 2020-02-17 00:20:33

恩,你理解的是正确的。

java设计设设计A.notify和A.wait两个对象方法,都要放到synchronized(A)的静态代码块里。本身notify和wait也是两个线程间的协同工作。

notifyAll会把wait的线程都唤醒,但是,抢不到锁的线程不能继续往下执行。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信