Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why using volatile with synchronized block?

I saw some examples in java where they do synchronization on a block of code to change some variable while that variable was declared volatile originally .. I saw that in an example of singleton class where they declared the unique instance as volatile and they sychronized the block that initializes that instance ... My question is why we declare it volatile while we synch on it, why we need to do both?? isn't one of them is sufficient for the other ??

public class SomeClass {     volatile static Object uniqueInstance = null;      public static Object getInstance() {         if (uniqueInstance == null) {             synchronized (someClass.class) {                 if (uniqueInstance == null) {                     uniqueInstance = new SomeClass();                 }             }         }         return uniqueInstance;     } } 

thanks in advance.

like image 639
Dorgham Avatar asked Mar 12 '12 10:03

Dorgham


People also ask

Should I use volatile with synchronized?

When to use Volatile over Synchronized modifiers can be summed up into this: Use Volatile when you variables are going to get read by multiple threads, but written to by only one thread. Use Synchronized when your variables will get read and written to by multiple threads.

Why might you use a synchronized block?

A Synchronized block is a piece of code that can be used to perform synchronization on any specific resource of the method. A Synchronized block is used to lock an object for any shared resource and the scope of a synchronized block is smaller than the synchronized method.

Which method must be used with synchronized block?

In Java, wait(), notify() and notifyAll() are the important methods that are used in synchronization. You can not apply java synchronized keyword with the variables.


1 Answers

Synchronization by itself would be enough in this case if the first check was within synchronized block (but it's not and one thread might not see changes performed by another if the variable were not volatile). Volatile alone would not be enough because you need to perform more than one operation atomically. But beware! What you have here is so-called double-checked locking - a common idiom, which unfortunately does not work reliably. I think this has changed since Java 1.6, but still this kind of code may be risky.

EDIT: when the variable is volatile, this code works correctly since JDK 5 (not 6 as I wrote earlier), but it will not work as expected under JDK 1.4 or earlier.

like image 174
Michał Kosmulski Avatar answered Oct 04 '22 21:10

Michał Kosmulski