2013-07-22 44 views
6
public synchronized int getCountOne() { 
     return count++; 
} 

与上述代码一样,在该方法上的同步在功能上等同于在该方法的主体周围具有synchronized (this) block。对象“this”不会被锁定,而是使用对象“this”作为mutex,并且主体被阻止与同时在“this”上同步的其他代码段同时执行。如何获取课程等级锁

基于相同的理由,当我们收购,如果我们有一个函数的类级lock.As

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

显然两个线程可以同时获得getCountOne锁(对象级锁),什么是用作mutex getCountTwo(班级锁定)。因此getCountOne类似于

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

是否有等价的getCountTwo?如果没有什么标准被用来获得一个级别锁?

回答

10

基于相同的理由时,我们获得了一类级别的锁

类对象本身是什么用作互斥将被用作互斥。您static synchronized方法等效synchronized块的样子:

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

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

参见JLS Section §8.4.3.6

甲同步方法获取监视器它执行(§17.1)之前。

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

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

强调我的。

+0

感谢您的好解释 – Prabhaker

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

不回答这个问题:“什么用作互斥体”? – EJP