Java tutorial
public class Volatile extends Object implements Runnable { // not marked as 'volatile', but it should be! private int value; private volatile boolean missedIt; // doesn't need to be volatile-doesn't change private long creationTime; public Volatile() { value = 10; missedIt = false; creationTime = System.currentTimeMillis(); } public void run() { print("entering run()"); // each time, check to see if 'value' is different while (value < 20) { // Used to break out of the loop if change to // value is missed. if (missedIt) { int currValue = value; // Simply execute a synchronized statement on an // arbitrary object to see the effect. Object lock = new Object(); synchronized (lock) { // do nothing! } int valueAfterSync = value; print("in run() - see value=" + currValue + ", but rumor has it that it changed!"); print("in run() - valueAfterSync=" + valueAfterSync); break; } } print("leaving run()"); } public void workMethod() throws InterruptedException { print("entering workMethod()"); print("about to sleep for 2 seconds"); Thread.sleep(2000); value = 50; print("just set value=" + value); print("about to sleep for 5 seconds"); Thread.sleep(5000); missedIt = true; print("just set missedIt=" + missedIt); print("about to sleep for 3 seconds"); Thread.sleep(3000); print("leaving workMethod()"); } private void print(String msg) { long interval = System.currentTimeMillis() - creationTime; String tmpStr = (interval / 1000.0) + "000"; int pos = tmpStr.indexOf("."); String secStr = tmpStr.substring(pos - 2, pos + 4); String nameStr = Thread.currentThread().getName(); nameStr = nameStr.substring(nameStr.length() - 8, nameStr.length()); System.out.println(secStr + " " + nameStr + ": " + msg); } public static void main(String[] args) { try { Volatile vol = new Volatile(); // slight pause to let some time elapse Thread.sleep(100); Thread t = new Thread(vol); t.start(); // slight pause to allow run() to go first Thread.sleep(100); vol.workMethod(); } catch (InterruptedException x) { System.err.println("one of the sleeps was interrupted"); } } }