简体   繁体   中英

Thread synchronized block with Class itself

I thought that following usage is to create a synchronized-block because ThreadMyClass.class is unique. But When I have created a heavy traffic with multiple Threads trying to access get() method, I have found out that many inconsistent states were created. So why threads are not synchronized with ThreadMyClass.class instance?

public ThreadMyClass {


 public Object  get(){

  synchronized (ThreadMyClass.class) {
    //get object return 
  }

 }
}


public static final  Object lock = new Object();

When I have changed ThreadMyClass.class with lock object , everything is working fine.

updated: here is my full code portion instance creation block is invoked more than one time.

   public static XmppInterface getInstance() throws XMPPException {
      if (instance == null) {
         synchronized (XmppInterface.class) {
            if (instance == null) {
              //create an instance
            }
         }
      }
      return instance;
   }

Well, you were synchronizing over the class , not its instance, which was tantamount to having a static synchronized method.

To synchronize over the instance of your class you can use a synchronized instance method.

Otherwise, synchronizing over an Object used for a lock will synchronize on that Object only, leaving the rest of your static and instance methods "free" from the synchronization strategy in place.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM