notify和wait的疑惑

来源:7-14 join注意点

陈三子

2020-02-16

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





写回答

1回答

悟空

2020-02-17

恩,你理解的是正确的。

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

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

0
0

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程