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

就像上面的代码在方法上同步在功能上等同于在synchronized (this) block方法体周围有一个。对象“this”不会被锁定,而是对象“this”被用作对象,mutex并且主体被阻止与其他也在“this”上同步的代码部分同时执行。

基于类似的理由,mutex当我们获得类级别的锁时使用什么。就像我们有一个函数一样

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

显然两个线程可以同时获取getCountOne(object level lock)和getCountTwo(class level lock)的锁。所以 getCountOne 类似于

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

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

4

2 回答 2

10

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

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

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

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

请参阅JLS 第 8.4.3.6 节

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

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

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

强调我的。

于 2013-07-22T09:10:08.840 回答
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 
  } 
 } 
}
于 2014-01-24T19:06:54.727 回答