Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
500 views
in Technique[技术] by (71.8m points)

在重量级锁的情况下等待池里的线程被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状态。

这一点让我感到很疑惑


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...