如果我们在没有同步
的对象上调用wait()
、notify()
或notifyAll()
> block ,我们在运行时得到一个 IllegalMonitorStateException
。
如果我尝试在没有同步块(synchronized block)的情况下调用这些方法,为什么编译器不标记我?
最佳答案
调用这些方法只需要当前线程是对象监视器的所有者。但是,这可能意味着从另一个同步块(synchronized block)的上下文中调用一个没有同步的方法。
例如:
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);
}
一般来说,现在有办法在编译时知道当当前线程不持有特定监视器时是否会执行任何代码段,这可能是编译器甚至不尝试标记这一点的原因。
关于java - 为什么在没有同步块(synchronized block)的情况下调用 wait()、notify() 或 notifyAll() 不是编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21812653/