java的long型和double型的读写应该不是原子的,所以有以下demo:
public class UnatomicLongDemo implements Runnable {
private static long test = 0;
private final long val;
public UnatomicLongDemo(long val) {
this.val = val;
}
@Override
public void run() {
while (!Thread.interrupted()) {
test = val;
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new UnatomicLongDemo(-1));
Thread t2 = new Thread(new UnatomicLongDemo(0));
t1.start();
t2.start();
long switchVal;
while ((switchVal = test) == -1 || switchVal == 0) {
//理论上如果读写不是原子的,那么总会出现此处test前32位和后32位分别来自-1和0的情况,跳出循环
}
System.out.println("got it!");
t1.interrupt();
t2.interrupt();
}
}
但是我的代码始终不能走出循环,这是为什么?平台window10 java 1.8
发现我的JDK是64位的,所以对于long double型的读写也是原子的