Java 类级锁定与对象级锁定对象级锁定:类级别锁定:

2022-09-01 04:04:53

如果线程 T1 通过获取类级锁进入方法 m1,这是否意味着另一个线程 T2 无法通过获取对象级锁来运行不同的方法 m2?


答案 1

不,这不是那个意思。“类级锁”只是不同对象上的常规锁,即。“对象级锁定”锁定在 上。SomeClass.classthis

编辑:为了确保我遵循您对术语的理解,您想知道m1和m2是否可以同时运行,如下所述:

public class SomeClass {
    public synchronized static void m1() {
       //do something
    }

    public synchronized void m2() {
       //do something
    }
}

答案是肯定的,m1和m2可以同时运行。它在功能上等效于此:

public class SomeClass {
    public static void m1() {
        synchronized (SomeClass.class) {
           //do something
        }
    }
    public void m2() {
        synchronized (this) {
           //do something
        }
    }
}

由于它们在完全不同的对象上进行同步,因此它们并不相互排斥。


答案 2

对象级锁定:

当您想要同步非静态方法或非静态代码块,以便只有一个线程能够在类的给定实例上执行代码块时,对象级锁定是一种机制。应始终执行此操作以使实例级数据线程安全。这可以按如下方式完成:

public class DemoClass 
{ 
  public synchronized void demoMethod(){} 
} 

or 

public class DemoClass 
{ 
  public void demoMethod(){ 
  synchronized (this) 
  { 
   //other thread safe code 
  } 
 } 
} 

or 

public class DemoClass 
{ 
  private final Object lock = new Object(); 
  public void demoMethod(){ 
  synchronized (lock) 
 { 
  //other thread safe code 
 } 
} 

类级别锁定:

类级锁定可防止多个线程在运行时进入所有可用实例中的任何一个的同步块。这意味着如果在运行时有 100 个 DemoClass 实例,那么一次只有一个线程能够在任何一个实例中执行 demoMethod(),而所有其他实例将被锁定为其他线程。应始终执行此操作以使静态数据线程安全。

public class DemoClass 
{ 
  public synchronized static void demoMethod(){} 
} 

or 

public class DemoClass 
{ 
  public void demoMethod(){ 
  synchronized (DemoClass.class) 
  { 
   //other thread safe code 
  } 
 } 
} 

or 

public class DemoClass 
{ 
 private final static Object lock = new Object(); 
 public void demoMethod(){ 
 synchronized (lock) 
  { 
   //other thread safe code 
  } 
 } 
}