I need a simple example of use of the volatile
keyword in Java, behaving inconsistently as a result of not using volatile
.
The theory part of volatile usage is already clear to me.
First of all, there's no guaranteed way of exposing caching due to non-volatile variables. Your JVM might just be very kind to you all the time and effectively treat every variable as volatile.
That being said, there are a few ways to increase probability of having threads caching their own versions of a non-volatile variable. Here is a program that exposes the importance of volatile in most machines I've tested it on (adapted version from here):
class Test extends Thread {
boolean keepRunning = true;
public void run() {
while (keepRunning) {
}
System.out.println("Thread terminated.");
}
public static void main(String[] args) throws InterruptedException {
Test t = new Test();
t.start();
Thread.sleep(1000);
t.keepRunning = false;
System.out.println("keepRunning set to false.");
}
}
This program will typically just output
keepRunning set to false.
and continue running. Making keepRunning
volatile causes it to print
keepRunning set to false.
Thread terminated.
and terminate.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With