The volatile keyword in Java is used as
an indicator to Java compiler and Thread that do not cache value of this
variable and always read it from main memory.
So if you want to share any variable in
which read and write operation is atomic by implementation e.g. read and write
in an int or a boolean variable then you can declare them as volatile variable.
The Java volatile keyword cannot be used
with method or class and it can only be used with a variable.
Java volatile keyword also guarantees
visibility and ordering, after Java 5 write to any volatile variable happens
before any read into the volatile variable. By the way use of volatile keyword
also prevents compiler or JVM from the reordering of code or moving away them
from synchronization barrier.
The Volatile variable Example
To Understand example of volatile keyword
in java let’s go back to Singleton pattern in Java and see double checked
locking in Singleton with Volatile and without the volatile keyword in java.
public class Singleton{
private static volatile Singleton _instance; //volatile variable
public static Singleton getInstance(){
if(_instance == null){
synchronized(Singleton.class){
if(_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
If you look at the code carefully you
will be able to figure out:
·
We
are only creating instance one time
·
We
are creating instance lazily at the time of the first request comes.
If we do not make the _instance variable
volatile than the Thread which is creating instance of Singleton is not able to
communicate other thread, that instance has been created until it comes out of
the Singleton block, so if Thread A is creating Singleton instance and just
after creation lost the CPU, all other thread will not be able to see value of
_instance as not null and they will believe its still null.
So in Summary apart from synchronized
keyword in Java, volatile keyword is also used to communicate the content of
memory between threads.
When to use Volatile variable in Java
You can use Volatile variable if you want
to read and write long and double variable atomically. long and double both are
64 bit data type and by default writing of long and double is not atomic and
platform dependence. Many platform perform write in long and double variable 2
step, writing 32 bit in each step, due to this its possible for a Thread to see
32 bit from two different write. You can avoid this issue by making long and
double variable volatile in Java.
A volatile variable can be used as an
alternative way of achieving synchronization in Java in some cases, like
Visibility. With volatile variable, it's guaranteed that all reader thread will
see updated value of the volatile variable once write operation completed,
without volatile keyword different reader thread may see different values.
volatile variable can be used to inform the compiler that a
particular field is subject to be accessed by multiple threads, which will
prevent the compiler from doing any reordering or any kind of optimization
which is not desirable in a multi-threaded environment. Without volatile
variable compiler can re-order the code, free to cache value of volatile
variable instead of always reading from main memory.
Another place where a volatile variable can be
used is to fixing double checked locking in Singleton pattern. As we discussed
in Why should you use Enum as Singleton that double checked locking was broken
in Java 1.4 environment.
We recommend you take Big Data Hadoop class room training at eMexo Technologies in electronic city, Bangalore to learn more about Big Data Hadoop.
0 Comments:
Post a Comment