我在类Lock
中声明了一个A
对象,并在类B
中调用了该锁的方法。
public class A{
final Lock accessLock = new ReentrantLock(true);
final Condition canexe = accessLock.newCondition();
B b = new B(this);
{
b.methodToLock();
}
}
public class B{
A a ;
public B(A a){
this.a = a;
}
public void methodToLock(){
a.accessLock.lock();
}
}
哪个对象会被锁定?
答案 0 :(得分:1)
实际锁定的对象是accessLock
实例。尝试获取同一实例上的锁的任何线程都会阻塞,无论它来自哪个类。
答案 1 :(得分:1)
首先,代码存在一些错误,因为lock
是一种方法:
public class B {
A a = new A();
public void methodToLock(){
a.accessLock.lock();
}
}
在这里,您尝试使用类A中的引用accessLock
到ReentrantLock
来获取锁。所以实际上您正在锁定在类B中声明的类A的特定实例。如果您创建了A类的新实例,那么将不会使用相同的锁来锁定它。它也没有锁定任何B类实例甚至B类本身。
这意味着如果多个线程试图修改此类中的实例a
,它们将被相应地阻止。