java - 为什么在没有同步块(synchronized block)的情况下调用 wait()、notify() 或 notifyAll() 不是编译器错误?

标签 java compiler-construction synchronization

如果我们在没有同步的对象上调用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/

相关文章:

编译器代码生成比较

php - 使用已编译的 PHP 代码为网站提供服务

java - 重新进入同步块(synchronized block)的成本

php - 数据同步如何工作以及如何在服务器-客户端应用程序中使用它?

java - 为什么 read() 的返回类型是整数?

java - 实体的 jaxb XML Marshall 中的 dbId ="0"

java - 如何使用个人 LDAP 服务器、LDIF 文件设置 java 应用程序

在编译时检查枚举值

http - 使用 sync.Pool 引用作为上下文值是否安全?

java - 如何使用 Spring JPA 仅使用对象的某些部分编写查询