在重量级锁的情况下等待池里的线程被notify以后会进入什么状态?

是关于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状态。

这一点让我感到很疑惑

阅读 2.8k
1 个回答

疑惑点在哪呢?
notify唤醒线程后,线程当然是RUNNABLE状态的,然后它要去争夺锁,没抢到就BLOCK啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题