我可以从另一个对象调用相同的同步锁等待吗?

时间:2014-02-28 19:09:30

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

  

每个对象都有一个与之关联的内在锁 ..一个线程被认为在它获得锁定并释放锁定之间拥有内在锁定[与同步] ... / p>

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

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