我认为以下用法是创建一个同步块,因为ThreadMyClass.class
是唯一的。 但是,当我创建了一个多线程访问方法的交通繁忙时,我发现有很多不一致的状态被创建。 那么为什么线程与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;
}
我没有看到这个代码的问题。如果我没有弄错,你的'get'-implementation应该等同于'public static synchronized Object get(){/ * get object return * /}'。也许导致这些暴力事件的原因在于你没有显示的代码?难道你不能展示一个完整的最小工作示例来展示这些问题,即添加线程创建,调用'get'和最小'get'-implementation? – 2014-11-04 14:51:18
另一个不使用类对象作为锁的原因是,其他类可以尝试同步它。潜在的死锁和延误。 – TedTrippin 2014-11-04 15:20:40
不幸的是,我无法重现一个不一致的状态。你的代码对我来说看起来很好,但也许我只是没有看到错误。但是,由于您似乎试图在'XmppInterface'上强制使用Singleton属性,因此您还可以使用枚举来解决此问题:查看Effective Java中的Item 3:http://uet.vnu.edu.vn/ 〜chauttm/e-books/java/Effective.Java.2nd.Mdition.2008.3000th.Release.pdf – 2014-11-04 15:21:37