java - 静态方法内的同步块(synchronized block)将获取类级锁或对象级锁

标签 java multithreading synchronized

在下面的代码片段中,我有一个问题。 线程将获取类级锁还是对象级锁?

private static Object lock=new Object();
private static Object lock2=new Object();

public static void m1(){
synchronized(lock){
//statements
}
}

public static void m2(){
synchronized(lock2){
//statements
}
}

最佳答案

每个对象都有一个“监视器”。当您使用同步块(synchronized block)时,您可以指定要在其监视器上同步的实例。除了同步 block 之外,还有同步方法。同步实例方法将获取调用该方法的实例的监视器,而同步静态方法将获取java.lang.Class的监视器 封闭类的对象。

public class Foo {

  private static final Object STATIC_LOCK = new Object();
  private final Object instanceLock = new Object();

  public static void bar() {
    synchronized (STATIC_LOCK) { // acquires monitor of "STATIC_LOCK" instance
      // guarded code
    }
  }

  public static synchronized void baz() { // acquires monitor of "Foo.class" instance
    // guarded code
  }

  public void qux() {
    synchronized (instanceLock) { // acquires monitor of "instanceLock" instance
      // guarded code
    }
  }

  public synchronized void quux() { // acquires monitor of "this" instance
    // guarded code
  }
}

关于java - 静态方法内的同步块(synchronized block)将获取类级锁或对象级锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59540141/

相关文章:

c# - 在 .NET Core 中强制线程停止

java - 从后台线程中的另一个类更新 GUI

java - BufferedReader.nextLine() 不会前进到下一行,所以我陷入了循环

java - 将屏幕坐标转换为舞台坐标

c++ - 线程数和每秒帧数有什么关系?

java - 误用同步?

java - 在函数中按类名同步是否在扩展类中有效?

java - 内存中引用变量和对象的逻辑结构/详细信息?

java - 在 Java 中使用 JSON API

thread-safety - Kotlin: "synchronized"使编译器不确定变量的初始化