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