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的业务代码中响应这个异常。