静态同步函数如何工作?

时间:2013-07-16 05:46:36

标签: java thread-safety synchronized

当Java成员需要线程安全时,我们会喜欢以下内容:

 public synchronized void func() {
     ...
 }

此语法相当于:

 public void func() {
      synchronized(this) {
           ....
      }
 }

也就是说,它实际上使用this来锁定。

我的问题是,如果我将synchronizedstatic方法一起使用,则如下所示:

class AA {
    private AA() {}

    public static synchronized AA getInstance() {
        static AA obj = new AA();
        return obj;
    }
}

在这种情况下,关于synchronized方法的锁定是什么?

3 个答案:

答案 0 :(得分:13)

如果是静态同步方法,class的{​​{1}}对象将是隐式锁定

等同于

class AA

答案 1 :(得分:7)

来自section 8.4.3.6 of the JLS

  

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

     

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

因此,您的代码会获取AA.class的监视器。正如sanbhat所说,它就像

synchronized(AA.class) {
    ...
}

...就像实例方法一样

synchronized(this) {
    ...
}

答案 2 :(得分:0)

它适用于AA.class锁。

public static AA getInstance() {
        synchronized(AA.class){
            static AA obj = new AA();
            return obj;
        }

}