java为什么在没有同步块的情况下调用wait()、notify()或notifyAll()不是编译器错误?
如果我们在没有synchronized
块的对象上调用wait()
、notify()
或notifyAll()
,我们在运行时会得到一个IllegalMonitorStateException
如果我试图在没有同步块的情况下调用这些方法,为什么编译器不标记我
你可以在下面搜索框中键入要查询的问题!
如果我们在没有synchronized
块的对象上调用wait()
、notify()
或notifyAll()
,我们在运行时会得到一个IllegalMonitorStateException
如果我试图在没有同步块的情况下调用这些方法,为什么编译器不标记我
# 1 楼答案
由于从一个线程到另一个线程的执行在运行时总是会发生变化,而且您可能会发现生产者-消费者问题,这个问题无法在编译时模拟,因为消费者正在消耗缓冲区,一旦缓冲区被消耗,它会在那个时候通知生产者,直到生产者将等待,否则会出现异常,所以这些方法的全部逻辑都在同步块中
# 2 楼答案
调用这些方法只需要当前线程是对象监视器的所有者。然而,这可能意味着在没有从另一个同步块的上下文中进行同步的情况下调用一个方法
例如:
一般来说,现在有一种方法可以在编译时知道,当当前线程没有特定的监视器时,是否会执行任何代码段,这可能就是为什么编译器甚至不尝试标记它的原因