有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

静态方法内部的java syncronized块将获得类级锁或对象级锁

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

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

共 (2) 个答案

  1. # 1 楼答案

    synchronized代码块中,您已经显式地将对象类实例用作监视器对象,这意味着它将只锁定那些对象

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

    Note - Every class definition itself is an instance of java.lang.Class

  2. # 2 楼答案

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