ward
ward

Reputation: 31

Using synchronized in Java

What's the difference between:

public synchronized void test(){}

and

public void test() {
   synchronized(Sample.class){}
}

Upvotes: 1

Views: 105

Answers (3)

Elist
Elist

Reputation: 5533

To complete @NPE's answer -

a synchronized method is actually a method that is synchronized on the object the method "belongs" to. Whether it's an instance object or the class object itself.

Therefore:

class Sample {
    public synchronized void test(){}
}

is equivalent to

class Sample {
    public void test() {
        synchronized(this) {}
    }
}

while

class Sample {
    public void test() {
       synchronized(Sample.class){}
    }
}

is equivalent to:

class Sample {
    public static synchronized void test(){}
}

Upvotes: 1

Mureinik
Mureinik

Reputation: 312146

Declaring a an instance method synchronized is just syntactic sugar that's equivalent to having a synchronized (this) block. In other words, only a single thread can execute the method on this instance at a single point of time.

synchronized (Sample.class) means that all instances of this class share a single lock object (the class object itself), and only a single thread can execute this method on any instance at a single point in time.

Upvotes: 1

NPE
NPE

Reputation: 500883

To make the difference more clear, the first can be rewritten as:

public void test() {    
   synchronized(this){    
   }    
}

The difference is that the first is synchronized on the instance of the class, whereas the second is synchronized on the class itself.

In the first case, two threads can simultaneously be executing test() on two instances of your class. In the second, they can't.

Upvotes: 5

Related Questions