- 1Java Exceptions
- 2Java Keywords
- 3Java abstract Keyword
- 4Java assert Keyword
- 5Java boolean Keyword
- 6Java break Keyword
- 7Java byte Keyword
- 8Java case Keyword
- 9Java catch Keyword
- 10Java char Keyword
- 11Java class Keyword
- 12Java const Keyword
- 13Java continue Keyword
- 14Java default Keyword
- 15Java do Keyword
- 16Java double Keyword
- 17Java else Keyword
- 18Java enum Keyword
- 19Java extends Keyword
- 20Java final Keyword
- 21Java finally Keyword
- 22Java float Keyword
- 23Java for Keyword
- 24Java goto Keyword
- 25Java if Keyword
- 26Java implements Keyword
- 27Java import Keyword
- 28Java instanceof Keyword
- 29Java int Keyword
- 30Java interface Keyword
- 31Java long Keyword
- 32Java native Keyword
- 33Java new Keyword
- 34Java null Keyword
- 35Java package Keyword
- 36Java private Keyword
- 37Java protected Keyword
- 38Java public Keyword
- 39Java return Keyword
- 40Java short Keyword
- 41Java static Keyword
- 42Java strictfp Keyword
- 43Java super Keyword
- 44Java switch Keyword
- 45Java synchronized Keyword
- 46Java this Keyword
- 47Java transient Keyword
- 48Java try Keyword
- 49Java void Keyword
- 50Java volatile Keyword
- 51Java while Keyword
- 52Java String Methods - Syntax and Description
- 53Java String
charAt()
method - 54Java String
codePointAt()
method - 55Java String
codePointBefore()
method - 56Java String
codePointCount()
method - 57Java String
compareTo()
method - 58Java String
compareToIgnoreCase()
method - 59Java String
concat()
method - 60Java String
contains()
method - 61Java String
contentEquals()
method - 62Java String
copyValueOf()
method - 63Java String
endsWith()
method - 64Java String
equals()
method - 65Java String
equalsIgnoreCase()
method - 66Java String
format()
method - 67Java String
getBytes()
method - 68Java String
getChars()
method - 69Java String
hashCode()
method - 70Java String
indexOf()
method - 71Java String
intern()
method - 72Java String
isEmpty()
method - 73Java String
join()
method - 74Java String
lastIndexOf()
method - 75Java String
length()
method - 76Java String
matches()
method - 77Java String
offsetByCodePoints()
method - 78Java String
regionMatches()
method - 79Java String
replace()
method - 80Java String
replaceAll()
method - 81Java String
replaceFirst()
method - 82Java String
split()
method - 83Java String
startsWith()
method - 84Java String
subSequence()
method - 85Java String
substring()
method - 86Java String
toCharArray()
method - 87Java String
toLowerCase()
method - 88Java String
toString()
method - 89Java String
toUpperCase()
method - 90Java String
trim()
method - 91Java String
valueOf()
method - 92Java ArrayList Methods - Complete Reference with Syntax and Description
- 93Java LinkedList Methods - Complete Reference with Syntax and Description
- 94Java HashMap Methods - Syntax and Descriptions
Java volatile Keyword
Usage and Examples
volatile
Keyword in Java
In Java, the volatile
keyword is used with variables to indicate that the value of a variable will be modified by different threads. It's a part of Java's memory management model and is crucial for safe access to shared variables in a concurrent application.
Why Do We Need volatile
?
Java threads may cache variables locally to improve performance. However, this can lead to situations where one thread doesn't see the most recent value of a variable modified by another thread.
By declaring a variable volatile
, we tell the JVM:
- Do not cache the value locally.
- Always read it from and write it to the main memory.
How volatile
Works
Let’s understand this with a simple example. Consider a boolean flag that controls whether a thread should continue running or not.
public class VolatileDemo extends Thread {
private volatile boolean running = true;
public void run() {
System.out.println("Thread started...");
while (running) {
// do work
}
System.out.println("Thread stopped.");
}
public void stopThread() {
running = false;
}
public static void main(String[] args) throws InterruptedException {
VolatileDemo thread = new VolatileDemo();
thread.start();
Thread.sleep(1000);
thread.stopThread(); // this will be seen by the other thread due to volatile
}
}
Thread started...
Thread stopped.
Without volatile
: What Goes Wrong?
If the running
variable is not marked volatile
, the thread might not stop as expected because it could be using a cached version of the variable that never sees the update.
Key Characteristics of volatile
- Visibility: Ensures the updated value is visible to all threads.
- No atomicity: It doesn’t make compound actions (like
count++
) atomic. - No locking: Unlike
synchronized
, it doesn’t use locks, hence it's lightweight and faster.
Common Use Cases for volatile
- Flags for stopping threads.
- Status or state monitoring variables.
- Double-checked locking (used with care).
Example: Visibility Without Synchronization
This demonstrates the difference volatile
makes.
public class WithoutVolatile {
private static boolean flag = false;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
while (!flag) {
// busy wait
}
System.out.println("Flag detected as true!");
}).start();
Thread.sleep(1000);
flag = true; // may not be visible to other thread
}
}
(no output - thread is stuck in infinite loop)
Now change flag
to volatile
and you’ll see:
Flag detected as true!
Difference Between volatile
and synchronized
Aspect | volatile |
synchronized |
---|---|---|
Guarantees Visibility | Yes | Yes |
Guarantees Atomicity | No | Yes |
Performance | Faster | Slower (due to locking) |
Use Case | Simple flags or state sharing | Complex critical sections |
Can You Use volatile
for Counters?
No. If you try to use volatile
for increment operations like count++
, it won't be thread-safe because ++
is not an atomic operation. Use AtomicInteger
or synchronization instead.
private volatile int count = 0;
public void increment() {
count++; // not thread-safe!
}