在另一个 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();
  }
}

哪个对象会被锁定?

实际锁定的对象是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,它们将相应地被阻止。