写个可见性的测试代码,发现了一个奇怪的情况
public class VolatileTest2 {
public VolatileTest2(int i) {
i++;
}
static boolean a = false;
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if (a) {
System.out.println("可见");
break;
}
// 非常的奇怪,new Object和一些自定义类时,没什么问题
// new String和Integer等对象时,竟然打印出来”可见“了,竟然保证的了可见性
// 可见:String、Integer、HashMap、Error、Boolean
// 不可见:自定义类、Object、ArrayList
new Boolean(true);
}
}
}).start();
Thread.sleep(2000);
new Thread(new Runnable() {
@Override
public void run() {
a = true;
}
}).start();
}
为什么在线程的while循环里new一些类的时候就可见了,new另外一些类的时候又不可见了。