我想在与锁定同步的对象不同的对象上调用等待和通知。以这段代码为例:
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/