java - 我可以从另一个对象调用 wait 相同的同步锁吗?

标签 java multithreading object wait notify

我想在与锁定同步的对象不同的对象上调用等待和通知。以这段代码为例:

Class1.foo() {
    synchronized(lock) {
        while(condition) { 
            try {
                lock.wait();
            }
        }
        lock.notify();
    }

}

我想知道这是否相当于:

Class1.foo() {
    synchronized(lock) {
         Class2.bar(lock);
    }
}

Class2.bar(Object lock) {
    while(condition) {
        try {
            lock.wait();
        }
    }
    lock.notify();
}

谢谢!

最佳答案

Monitors and synchronization 与对象关联,而不是变量:

Every object has an intrinsic lock associated with it .. A thread is said to own the intrinsic lock between the time it has acquired the lock and released the lock [as with synchronized] ..

在给定的代码中,可以看出,在后一种情况下,简单地内联方法调用会导致以相同的顺序使用相同的对象。

Class1.foo() {
    synchronized(lock) {
        while(condition) { 
            try {
                lock.wait();
            }
        }
        lock.notify();
    }
}

Class1.foo() {
    synchronized(lock) {
    // >> inline from Class2.bar(Object lock) {
    //    where lock evaluates to the same object
        while(condition) {
            try {
                lock.wait();
            }
        }
        lock.notify();
    // << end inline }
   }
}

以上内容仅论证了所提供代码的等效性,并未做出进一步的声明。也就是说,它假设 Class2.bar 仅从 Class1.foo 调用(或者在调用期间在同一对象上同步)。

关于java - 我可以从另一个对象调用 wait 相同的同步锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22103807/

相关文章:

java - 获取 'java.lang.UnsatisfiedLinkError' : no lwjgl in java. 库.path

c++ - 减少具有相同优先级的线程之间的上下文切换

c# - Pythonnet如何正确停止脚本执行

java - java中如何动态创建数据对象?

java - Java 中的 Makefile 创建

java - BeforeAll 方法中没有为参数注册 ParameterResolver

Java将加密字符串存储到MySQL数据库中

java - 关于根据条件启动线程

Java集合removeAll没有删除任何东西

javascript - 推断组序列的算法名称