Java 我可以从另一个对象对同一个同步锁调用wait吗?

Java 我可以从另一个对象对同一个同步锁调用wait吗?,java,multithreading,object,wait,notify,Java,Multithreading,Object,Wait,Notify,我想在不同的对象上调用wait和notify,而不是在锁上同步的对象。以这段代码为例: Class1.foo() { synchronized(lock) { while(condition) { try { lock.wait(); } } lock.notify(); } } 我想知道这是否等同于: Class1.foo() { syn

我想在不同的对象上调用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();
}
谢谢

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

每个对象都有一个与之关联的内在锁。。一个线程在获取锁和释放锁之间拥有内在锁[与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 }
   }
}
Class1.foo(){
已同步(锁定){
while(条件){
试一试{
lock.wait();
}
}
lock.notify();
}
}
类别1.foo(){
已同步(锁定){
//>>来自Class2.bar的内联(对象锁){
//其中lock计算为同一对象
while(条件){
试一试{
lock.wait();
}
}
lock.notify();

//可以,但这是可能出现死锁的典型情况。您需要始终确保所有线程以相同的顺序锁定锁。