我发现volatile 对于基本类型的包装类不可见,当线程A修改了变量,如果线程B去获取这个变量的值,线程A无法看见线程B的修改,如果改成其他数据类型的数据,则没有问题。这有点奇怪。
接下来来个简单例子测试一下。
public class VolatileTestA extends Thread{
private volatile Integer i;
public VolatileTestA(Integer i) {
super();
this.i = i;
}
@Override
public void run() {
i++;
}
}
再建立一个main类
public class VolatileTest extends Thread{
private volatile static Integer f = new Integer(0);
@Override
public void run() {
System.out.println(f);
}
public static void main(String[] args) throws InterruptedException {
new VolatileTestA(f).start();
Thread.sleep(1000);
new VolatileTest().start();
}
}
这样输出的结果是0