public class Test { protected long l = -1l; public static void main(String[] args) { System.out.println(toBinary(-1l)); System.out.println(toBinary(1l)); Test t = new Test(); Worker w1 = new Worker(t); Worker2 w2 = new Worker2(t); w1.setDaemon(true); w2.setDaemon(true); w1.start(); w2.start(); while (true) { if (t.l != -1l && t.l != 1l) { System.out.println(toBinary(t.l)); System.out.println("l的写不是原子操作"); break; } } } private static String toBinary(long l) { StringBuilder sb = new StringBuilder(Long.toBinaryString(l)); while (sb.length() < 64) { sb.insert(0, "0"); } return sb.toString(); } } class Worker extends Thread { public Worker(Test t) { this.t = t; } private Test t; public void run() { while (true) { t.l = -1l; } } } class Worker2 extends Thread { public Worker2(Test t) { this.t = t; } private Test t; public void run() { while (true) { t.l = 1l; } } }
线程1和2不停的将l变量的值设置为 -1 和 1 ,结果,l的值既不等于1,也不等于-1
证明32位java对long和double的写操作不是原子性的
原文:http://my.oschina.net/u/1047640/blog/510397