我认为以下用法是创建一个synchronized块,因为ThreadMyClass.class
是唯一的。
但是当我创建了一个繁重的流量,多个线程尝试访问get()
方法时,我发现创建了许多不一致的状态。
那么为什么线程不与ThreadMyClass.class
实例同步?
public ThreadMyClass {
public Object get(){
synchronized (ThreadMyClass.class) {
//get object return
}
}
}
public static final Object lock = new Object();
当我使用ThreadMyClass.class
对象更改lock
时,一切正常。
更新: 这是我的完整代码部分实例创建块被多次调用。
public static XmppInterface getInstance() throws XMPPException {
if (instance == null) {
synchronized (XmppInterface.class) {
if (instance == null) {
//create an instance
}
}
}
return instance;
}
答案 0 :(得分:2)
嗯,你正在同步class
,而不是它的实例,这相当于拥有static synchronized
方法。
要在班级实例上进行同步,您可以使用synchronized
实例方法。
否则,通过用于锁定的Object
进行同步将仅在Object
上进行同步,而剩下的静态和实例方法将自由地保留"从同步策略到位。