Java 线程与类本身同步的块
我认为下面的用法是创建一个同步块,因为Java 线程与类本身同步的块,java,multithreading,Java,Multithreading,我认为下面的用法是创建一个同步块,因为ThreadMyClass.class是唯一的。 但是当我创建了一个多线程试图访问get()方法的高流量时,我发现创建了许多不一致的状态。 那么为什么线程不与ThreadMyClass.class实例同步呢 public ThreadMyClass { public Object get(){ synchronized (ThreadMyClass.class) { //get object return } } } pu
ThreadMyClass.class
是唯一的。
但是当我创建了一个多线程试图访问get()
方法的高流量时,我发现创建了许多不一致的状态。
那么为什么线程不与ThreadMyClass.class
实例同步呢
public ThreadMyClass {
public Object get(){
synchronized (ThreadMyClass.class) {
//get object return
}
}
}
public static final Object lock = new Object();
当我使用lock
对象更改ThreadMyClass.class
时,一切都正常工作
更新:
下面是我的完整代码部分实例创建块被多次调用
public static XmppInterface getInstance() throws XMPPException {
if (instance == null) {
synchronized (XmppInterface.class) {
if (instance == null) {
//create an instance
}
}
}
return instance;
}
嗯,您是通过
类
进行同步的,而不是它的实例,这相当于拥有一个静态同步
方法
要在类的实例上进行同步,可以使用synchronized
instance方法
否则,通过用于锁定的
对象
进行同步将仅在该对象
上进行同步,使其余静态和实例方法不受同步策略的影响 我看这个代码没有问题。如果我没有弄错的话,您的get
-实现应该相当于公共静态同步对象get(){/*get对象return*/}
。可能不一致的原因是您没有显示的代码?您不能展示一个完整的最小工作示例来展示问题,即添加线程创建、对get
的调用和最小get
-实现吗?不使用类对象作为锁的另一个原因是,其他类可以尝试在其上同步。可能出现死锁和延迟。不幸的是,我无法重现不一致的状态。你的代码在我看来很好,但也许我就是看不到错误。但是,由于您似乎试图在xmppineterface
上强制执行Singleton属性,因此也可以使用枚举解决此问题:查看有效Java中的第3项:此代码不直接在JVM上运行,而是在weblogic 12c上运行。所以我认为应该有一些生活技巧。根据网站,我的用法应该是正确的。我使用的是类级锁定@mmc18快速浏览了这篇文章。它基本上强调了所谓的“对象级锁定”(似乎包括对象锁定和实例锁定)和类级锁定之间的区别。还有其他一些未提及的习惯用法,例如使用实际的java.util.concurrent.locks.Lock
,等等。这一切都取决于上下文和您想要实现的目标。