Java 在另一个类中声明Lock对象并调用Lock';另一个类中的方法

Java 在另一个类中声明Lock对象并调用Lock';另一个类中的方法,java,multithreading,synchronization,Java,Multithreading,Synchronization,我在类a中声明了一个Lock对象,并在类B中调用该locks的方法 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)

我在类
a
中声明了一个
Lock
对象,并在类
B
中调用该locks的方法

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();
  }
}
哪个对象将被锁定

  • A类的对象是什么
  • B类的对象

实际锁定的对象是
accessLock
实例。任何试图在同一实例上获取锁的线程都将被阻止,无论它来自哪个类。

首先,代码有一些错误,因为锁是一种方法:

public class B {
    A a = new A();
    public void methodToLock(){
        a.accessLock.lock();

    }
}
在这里,您试图使用类a中对
ReentrantLock
的引用
accessLock
来获取锁。因此,实际上,您是在类B中声明的类a的特定实例上获取锁。如果您创建类a的新实例,则不会使用相同的锁锁定该实例。此外,它对类B的任何实例甚至类B本身都没有锁定


这意味着,如果多个线程试图修改此类中的实例
a
,它们将被相应地阻止。

我对您的代码进行了一些更改,以使其能够编译。它有多个问题。你能证实我所做的与你的意图是否相符吗Thanks@bvdb很好,谢谢!