Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Complete example for use of volatile key word in Java?

Tags:

java

volatile

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.

like image 922
user1418683 Avatar asked May 26 '12 06:05

user1418683


1 Answers

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.

like image 91
aioobe Avatar answered Oct 01 '22 20:10

aioobe