繁体   English   中英

静态方法中的同步块将获取类级锁或对象级锁

[英]syncronized block inside static method will acquire Class level lock or Object level lock

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

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
}
}

每个对象都有一个“监视器”。 当您使用同步块时,您可以指定要在其监视器上同步的实例。 除了同步,还有同步方法 同步实例方法将获取调用该方法的实例的监视器,而同步静态方法将获取封闭类的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
  }
}

您已在synchronized代码块中明确使用 Object 类实例作为监视器对象,这意味着它只会锁定这些对象

当您将函数定义为staticsynchronized函数时,代码块使用 Class 本身作为监视器对象。 因为当您定义一个静态函数时,该函数属于类本身,这意味着您不需要类实例来调用此类函数。 因此,如果将静态函数定义为synchronized函数,那么它在多线程环境中的执行将需要锁定所有此类线程中的某个公共监视器对象,在这种情况下,它是class本身。

注意 - 每个类定义本身都是java.lang.Class 的一个实例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM