Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Static members need special synchronization blocks?

I have a class which looks something like this:

public class Test {

private static final Object someObject = new Object();

public void doSomething()
{
    synchronized (someObject) {
        System.out.println(someObject.toString());
    }
}

}

Can I consider the object to be synchronized, or is there a problem since it is a static member?

Edit: note that different threads might be accessing doSomething() and the object must be accessed in a thread-safe manner in that case.

like image 866
Yuval Adam Avatar asked Dec 17 '22 10:12

Yuval Adam


2 Answers

By using a static object as your monitor object, only one thread using ANY instance of the Test class can get into the sync block. If the monitor object was not a static object, other threads holding different instances of the Test class could get into the sync block.

like image 54
David M. Karr Avatar answered Dec 28 '22 09:12

David M. Karr


Here someObject is acting as a lock (monitor) for all objects of type Test. That is, if doSomething() is invoked on two separate instances of Test, one will block before the other completes. This is different from a synchronized method which which is mostly equivalent to the code above with someObject replaced by this.

Changing someObject to non-static will result in per--instance locking. This is essentially the "private lock object" idiom as described in item 70 of Effective Java.

like image 21
Dave Ray Avatar answered Dec 28 '22 07:12

Dave Ray