我想调用一个等待并通知另一个对象,而不是锁定同步的对象。以此代码为例:
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();
}
谢谢!
答案 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
调用(或者在调用期间在同一对象上同步)。