6

当 Java 成员需要是线程安全的时,我们执行以下操作:

 public synchronized void func() {
     ...
 }

此语法等效于:

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

也就是说,它实际上this用于锁。

我的问题是,如果我使用synchronized一种static方法,如下所示:

class AA {
    private AA() {}

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

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

4

3 回答 3

13

在静态同步方法的情况下,class您的对象class AA将是隐式锁定

它相当于

class AA {
    private AA() {}

    public static AA getInstance() {
        synchronized(AA.class) {
           AA obj = new AA();
           return obj;
        }
    }
}
于 2013-07-16T05:47:35.720 回答
7

JLS 的第 8.4.3.6 节

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

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

因此,您的代码获取了AA.class. 正如sanbhat所说,就像

synchronized(AA.class) {
    ...
}

...就像使用实例方法一样

synchronized(this) {
    ...
}
于 2013-07-16T05:49:27.810 回答
0

它适用于 AA.class 锁。

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

}
于 2013-07-16T05:51:11.953 回答