并发最低安全性
例如在某些实时性统计的时候我们只需要这种最低安全性保障就够了,
在多线程并发的情况下.基本类型和引用都能保证最低安全性.
但是在32位jre的情况下long和double是不能保证这种安全性的...可能会读取到严重的错误值,例如读取到了2次不同更新的高32位和低32位的组合值!
补充,其实CopyOnWriteArray也是一种保证最低安全性然后获得性能提升的办法
下面是一个测试在32位系统上,非常快就能输出error:3333333355555555,
而在64位系统没有这种问题.可以给变量加上volatile修饰符获得这种最低安全性!
package sb.test;
import java.util.Arrays;
/**
* jvm参数 -server -verbose:gc -Xms1024m -Xmx1536m
*
* @author zuoge85
*
*/
public class VolatileTest {
private static final int THREAD_NUMS = 4;
private static final long NUMS = 10000000000000000l;
public static void main(String[] args) {
try {
test();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static long value = 0;
private static final long[] values = {0x3333333333333333l,0x4444444444444444l,0x5555555555555555l,0x6666666666666666l};
private static void test() throws InterruptedException {
Thread[] ts = new Thread[THREAD_NUMS];
for (int i = 0; i < ts.length; i++) {
final int n = i;
ts[i] = new Thread() {
public void run() {
for (int j = 0; j < NUMS; j++) {
value = values[n];
}
}
};
}
Thread readThread = new Thread(){
public void run() {
while(true){
long v = value;
if(Arrays.binarySearch(values, value) >=0){
}else{
System.out.println("error:"+Long.toHexString(v));
}
}
}
};
for (int i = 0; i < ts.length; i++) {
ts[i].start();
}
readThread.start();
for (int i = 0; i < ts.length; i++) {
ts[i].join();
}
readThread.stop();
readThread.join();
System.out.println(value);
}
}