[英]Why isn't calling wait(), notify() or notifyAll() without a synchronized block not a compiler error?
如果我们在没有synchronized
块的对象上调用wait()
, notify()
或notifyAll()
,我们会在运行时获得IllegalMonitorStateException
。
如果我尝试在没有同步块的情况下调用这些方法,为什么编译器不会标记我?
调用这些方法只需要当前线程是对象监视器的所有者。 但是,这可能意味着在另一个同步块的上下文中调用未同步的方法。
例如:
public void doWait(Object o) {
o.wait(); // you would like the compiler to flag this
}
// but in this case it is valid
synchronized(this)
{
doWait(this);
}
通常,现在有一种方法可以在编译时知道当前线程没有保存特定监视器时是否会执行任何代码,这可能是编译器甚至不尝试标记这一点的原因。
无法证明堆栈中的某个方法尚未获得监视器。
例如:
class Foo
{
void foo()
{
synchronized (bar)
{
bar.bar();
}
}
}
class Bar
{
void bar()
{
this.wait();
}
}
是合法的(假设bar
是Bar
一个实例),但是不可能证明在没有首先获得监视器的情况下没有代码调用bar
。
由于从一个线程到另一个线程的执行总是在运行时更改,并且您可以解决生产者 - 消费者问题,因此在编译时无法模拟问题,因为消费者在消耗缓冲区消耗缓冲区后会通知生产者那个时间和那个时间生产者会等待,否则会有异常,所以这些方法的整个逻辑都在同步块内
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.