/** * Created by qi<a href="http://xiongyingqi.com">xiongyingqi.com</a> on 15-4-7. */ public class LongTest { public static void main(String[] args) throws Exception { Run r = new Run(); for (int i = 0; i < 10; i++) new Thread(r).start(); } } class Run implements Runnable { static final int MIN = 0; static final int MAX = 2000000000; // 这里加不加volatile都是一样的结果。 volatile int num = MIN; @Override public void run() { // 变量num就始终就两个取值,MIN和MAX,在这两个值之间来回赋值。 // 如果发现num即不是MIN、也不是MAX, // 就会走到System.err输出这行代码, // 那么就说明有某个线程读取到了一个错误的值。 for (int i = 0; i < 999999; i++) { if (num != MIN && num != MAX) { System.err.println("!!! "); return; } num = MAX; num = MIN; } } }