在另一个 Class 中声明 Lock 对象并在另一个 class 中调用锁的方法
declared Lock object in Another Class and invoke lock's method in another class
我在 class A
中声明了一个 Lock
对象,我在 class 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();
}
}
哪个对象会被锁定?
- classA的对象?
- class B 的对象 ?
实际锁定的对象是accessLock
实例。任何试图在同一实例上获取锁的线程都将阻塞,无论它来自哪个class。
首先代码有一些错误,因为 lock
是一个方法:
public class B {
A a = new A();
public void methodToLock(){
a.accessLock.lock();
}
}
这里您尝试使用 class A 中对 ReentrantLock
的引用 accessLock
来获取锁。所以实际上您正在锁定 [=21 的特定实例=] A 在 class B 中声明。如果您创建 class A 的新实例,则不会使用相同的锁对其进行锁定。它也没有锁定 class B 的任何实例甚至 class B 本身。
这意味着如果多个线程试图修改此 class 中的实例 a
,它们将相应地被阻止。
我在 class A
中声明了一个 Lock
对象,我在 class 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();
}
}
哪个对象会被锁定?
- classA的对象?
- class B 的对象 ?
实际锁定的对象是accessLock
实例。任何试图在同一实例上获取锁的线程都将阻塞,无论它来自哪个class。
首先代码有一些错误,因为 lock
是一个方法:
public class B {
A a = new A();
public void methodToLock(){
a.accessLock.lock();
}
}
这里您尝试使用 class A 中对 ReentrantLock
的引用 accessLock
来获取锁。所以实际上您正在锁定 [=21 的特定实例=] A 在 class B 中声明。如果您创建 class A 的新实例,则不会使用相同的锁对其进行锁定。它也没有锁定 class B 的任何实例甚至 class B 本身。
这意味着如果多个线程试图修改此 class 中的实例 a
,它们将相应地被阻止。