当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
方法的锁定是什么?
答案 0 :(得分:13)
如果是静态同步方法,class
的{{1}}对象将是隐式锁定
等同于
class AA
答案 1 :(得分:7)
同步方法在执行之前获取监视器(第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;
}
}