java - 下面的代码会执行成功吗?

标签 java multithreading reentrantlock reentrancy

在 Brian Goetz 的 Java Concurrency in Practice 中,有以下示例解释了 Java 中锁的可重入性:

public class Widget {
  public synchronized void doSomething() {
    ...
  }
}

public class LoggingWidget extends Widget {
  public synchronized void doSomething() {
    System.out.println(toString() + ": calling doSomething");
    super.doSomething();
  }
}

它表示由于 Java 中锁的可重入性,上述代码不会导致死锁,因为锁是基于每个线程而不是每个调用获得的。

但是,如果我们稍微扭曲一下这个例子:

public class XYZ {
  public synchronized void someFunction() {
    ...
  }
}

public class SomeClass {
  private XYZ xyz;
  ...
  public synchronized void functionCalled() {
    ...
    xyz.someFunction();
  }
}

我们调用了SomeClass的functionCalled(),在SomeClass的对象上获得了锁。现在,将调用 someFunction() 或换句话说,线程将进入 xyz 类的 someFunction() 。 XYZ 类的同步函数会要求锁定 XYZ 类的对象吗?我有一点困惑。请澄清。

最佳答案

是的,上面的代码将要求锁定 SomeClassxyz 对象。然而,这不会导致任何问题。

xyz 对象是private,因此任何线程都不可能在调用functionCalled() 之前首先锁定xyz ,因此不会出现死锁,因为这里的两个锁总是按照SomeClass -> xyz的顺序调用。

关于java - 下面的代码会执行成功吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52300948/

相关文章:

java - HashMap 获取对象的值是 "equal"但哈希值不同?

java - "finally" block 的功能是什么?

c++ - boost 线程 : is it possible to limit the run time of a thread before moving to another thread

multithreading - 将 IO::Async 与矢量化 STDIN 一起使用

java - java - 如何创建公平锁来解决java中的饥饿问题?

Java - 静态方法上的可重入 WriteLock

java - 根据附加值获取枚举?

java - 我们可以在 @HystrixCommand 上使用 @Async

java - 当数据可用时,如何从 map 获取数据?

java - Future.cancel 和 ReentrantLocks