Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程与类本身同步的块_Java_Multithreading - Fatal编程技术网

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
,等等。这一切都取决于上下文和您想要实现的目标。