如果线程在同步块之前等待监视器被释放或者它是否调用wait()有什么区别吗?

时间:2010-10-06 12:54:12

标签: java multithreading wait synchronized notify

我已经阅读了很多关于线程状态的文档,其中一些文档告诉我有两种不同的状态:阻塞(在同步之前)和等待(如果调用等待),其他一些状态告诉我们只有一种状态:等待。此外,一些文档告诉你应该为每个wait()调用notify(),如果不这样做,那么即使监视器被解锁,线程waiting()也永远不会被执行。

4 个答案:

答案 0 :(得分:13)

从上一句话开始,我发现您并未完全理解synchronizedwait() / notify()之间的区别。

基本上,监视器具有锁定条件。这几乎是正交概念。

  • 当线程进入synchronized块时,它会获得一个锁。当线程离开时,它会释放一个锁。只有一个线程可以锁定特定的监视器。

  • 当具有锁定的线程调用wait()时,它会释放锁定并开始等待其状态。当具有锁的线程调用notify()时,等待条件的其中一个线程(在notifyAll()的情况下的所有线程)都有资格执行(并开始等待获取锁,因为通知线程仍然有它)。

因此,等待获取锁(Thread.State.BLOCKED)并等待监视器的条件(Thread.State.WAITING)是不同且独立的状态。

如果你看一下Lock类,这个行为会更清楚 - 它实现了与synchronized块相同的同步原语(带有一些扩展),但是在锁和条件之间提供了明确的区别。

答案 1 :(得分:1)

Standard doc is here

  

线程调用Object.wait时   方法,它释放这个获得   监视并放入WAITING(或   如果我们调用超时,则TIMED_WAITING   等待方法的版本)状态。   现在,当线程被通知时   notify()notifyAll()致电   同一个对象然后是等待状态   线程结束和线程   开始试图重获所有   它在监控中获得的监控器   等待时间。曾经有一次   可能是几个线程试图   重获(或者可能获得第一个   时间)他们的监视器。如果不止一个   线程尝试获取监视器   然后只有一个特定对象   线程(由JVM调度程序选择)   被授予监视器和所有其他   线程被置于BLOCKED状态。

答案 2 :(得分:1)

two different states阻止和等待。

如果没有人通知(或打断)你是真的,那么关于永远等待的部分。

答案 3 :(得分:0)

在Java的角度(Thread.State)中,有两种不同的状态:BLOCKED和WAITING。当线程在Object上同步时,它处于BLOCKED状态。线程执行wait后,它处于WAITING状态。

在Linux平台上,Java线程是OS本机线程。 BLOCKED和WAITING状态的OS线程状态是可中断睡眠。使用ps检查时,BLOCKED和WAITING线程的状态为“Sl +”。