如何获取类级别锁定

时间:2013-07-22 09:05:45

标签: java static synchronization locking

public synchronized int getCountOne() {
        return count++;
 }

与上面的代码一样,该方法的同步在功能上等同于在方法体周围有synchronized (this) block。对象“this”不会被锁定,而是将对象“this”用作mutex,并且阻止正文与同时在“this”上同步的其他代码段同时执行。

基于类似理由,当我们获得类级别锁时,用作mutex。如果我们有一个函数

public static synchronized int getCountTwo() {
        return count++;
 }

显然,两个线程可以同时获取getCountOne(对象级别锁定)和getCountTwo(类级别锁定)的锁定。因此getCountOne类似于

public int getCountOne() {
     synchronized(this) {
          return count++;
     }
 }

是否相当于getCountTwo?如果没有使用什么标准来获得类级锁?

2 个答案:

答案 0 :(得分:10)

  

基于类似的理由,当我们获得类级锁时,它被用作互斥锁

类对象本身将用作互斥锁。 static synchronized方法的等效同步块如下所示:

public static int getCountTwo() {
     synchronized(ClassName.class) {
          return count++;
     }
}

ClassName是包含该方法的类的名称。

请参阅JLS Section §8.4.3.6

  

同步方法在执行之前获取监视器(第17.1节)。

     

对于类(静态)方法,与类关联的监视器   使用方法类的对象

     

对于实例方法,与此关联的监视器(对象   (使用该方法)。

强调我的。

答案 1 :(得分:0)

对象级锁定:

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

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