Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Purpose/advantages of volatile

What exactly is a situation where you would make use of the volatile keyword? And more importantly: How does the program benefit from doing so?

From what I've read and know already: volatile should be used for variables that are accessed by different threads, because they are slightly faster to read than non-volatile ones. If so, shouldn't there be a keyword to enforce the opposite?

Or are they actually synchronized between all threads? How are normal variables not?

I have a lot of multithreading code and I want to optimize it a bit. Of course I don't hope for huge performance enhancement (I don't have any problems with it atm anyway), but I'm always trying to make my code better. And I'm slightly confused with this keyword.

like image 669
AyCe Avatar asked Feb 22 '14 06:02

AyCe


People also ask

What is the purpose of a volatile variable?

Volatile keyword is used to modify the value of a variable by different threads. It is also used to make classes thread safe. It means that multiple threads can use a method and instance of the classes at the same time without any problem. The volatile keyword can be used either with primitive type or objects.

What is the disadvantage of volatile?

Some drawbacksThe semantics of volatile is not as strong as locking and hence might not provide atomicity. It might cause thread contention which is basically the concurrent of a resource by multiple threads. Code is a bit more complicated than normal locks.

What is the purpose of volatile keyword in Java?

The volatile modifier is used to let the JVM know that a thread accessing the variable must always merge its own private copy of the variable with the master copy in the memory. Accessing a volatile variable synchronizes all the cached copied of the variables in the main memory.

When should volatile be used?

A variable should be declared volatile whenever its value could change unexpectedly. In practice, only three types of variables could change: Memory-mapped peripheral registers. Global variables modified by an interrupt service routine.


2 Answers

When a multithreaded program is running, and there is some shared variable which isn't declared as volatile, what these threads do is create a local copy of the variable, and work on the local copy instead. So the changes on the variable aren't reflected. This local copy is created because cached memory access is much faster compared to accessing variables from main memory.

When you declare a variable as volatile, it tells the program NOT to create any local copy of the variable and use the variable directly from the main memory.

By declaring a variable as volatile, we are telling the system that its value can change unexpectedly from anywhere, so always use the value which is kept in the main memory and always make changes to the value of the variable in the main memory and not create any local copies of the variable.

Note that volatile is not a substitute for synchronization, and when a field is declared volatile, the compiler and runtime are put on notice that this variable is shared and that operations on it should not be reordered with other memory operations. Volatile variables are not cached in registers or in caches where they are hidden from other processors, so a read of a volatile variable always returns the most recent write by any thread.

like image 55
Aman Agnihotri Avatar answered Sep 27 '22 20:09

Aman Agnihotri


Volatile make accessing the variables slower by having every thread actually access the value each time from memory thus getting the newest value.

This is useful when accessing the variable from different threads.

Use a profiler to tune code and read Tips optimizing Java code

like image 20
Javier Avatar answered Sep 27 '22 21:09

Javier