是关于synchronized关键字的使用
1.对于重量级锁线程在未竞争到锁时会被阻塞,然后以阻塞(blocked)状态进入锁池(Entry Set)中,等待锁释放,并重新竞争锁。
2.对于执行到wait()方法的线程会变成waiting状态,进入等待池
总之等待池中的线程都是waiting状态,锁池的线程都是blocked状态,以上是我的理解,如果有错误请大家指出。
问题在于,notify()/notifyAll()方法执行后,等待池的线程是不是直接由waiting状态变成blocked状态转移到锁池?进入锁池之前会不会先转变成runnable状态?
提出这个疑问是因为看到了这篇文章:你真的懂wait、notify和notifyAll吗
其中提到:
当对象的notify()方法被调用时,JVM会唤醒处于Wait Set中的某一个线程,这个线程的状态就从WAITING转变为RUNNABLE;或者当notifyAll()方法被调用时,Wait Set中的全部线程会转变为RUNNABLE状态。
这一点让我感到很疑惑
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…