【问题标题】:Can I call wait on the same synchronized lock from another object?我可以在另一个对象的同一个同步锁上调用 wait 吗?
【发布时间】:2014-02-28 19:09:29
【问题描述】:

我想在一个不同的对象上调用等待和通知,而不是在锁上同步的对象。以这段代码为例:

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();
}

谢谢!

【问题讨论】:

  • 您可以,但这是可能出现死锁的经典案例。您需要始终确保所有线程以相同的顺序锁定锁。

标签: java multithreading object wait notify


【解决方案1】:

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

每个对象都有一个与之关联的内在锁 .. 一个线程在它获得锁和释放锁之间拥有内在锁 [与同步一样] ..

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

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 调用(或者在调用期间在同一对象上同步)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2016-12-12
    • 2013-03-12
    • 2019-08-21
    • 1970-01-01
    相关资源
    最近更新 更多