在另一个类中声明了Lock对象,并在另一个类中调用了lock的方法

时间:2015-07-01 06:39:16

标签: java multithreading synchronization

我在类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();
  }
}

哪个对象会被锁定?

  • A类的对象?
  • B级的对象?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

首先,代码存在一些错误,因为lock是一种方法:

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

    }
}

在这里,您尝试使用类A中的引用accessLockReentrantLock来获取锁。所以实际上您正在锁定在类B中声明的类A的特定实例。如果您创建了A类的新实例,那么将不会使用相同的锁来锁定它。它也没有锁定任何B类实例甚至B类本身。

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