线程同步块与类本身

时间:2014-11-04 14:40:34

标签: java multithreading

我认为以下用法是创建一个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;
   }

1 个答案:

答案 0 :(得分:2)

嗯,你正在同步class,而不是它的实例,这相当于拥有static synchronized方法。

要在班级实例上进行同步,您可以使用synchronized实例方法。

否则,通过用于锁定的Object进行同步将仅在Object上进行同步,而剩下的静态和实例方法将自由地保留"从同步策略到位。