实验一:ArrayList多线程下的可见性
代码
private static List<Integer> list;
static {
list = new ArrayList<Integer>(20);
list.add(0);
}
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(1);
new Thread(()->{
Thread.sleep(200);
list.set(0,1);
System.out.println("set 1");
}).start();
new Thread(()->{
while (list.get(0) == 0){
}
System.out.println("end");
latch.countDown();
}).start();
latch.await();
}
现象
结果打印出"set 1"后,程序死循环无法退出。线程1中对list的操作对线程2不可见,导致while死循环无法退出。在多

本文通过三个实验深入探讨了Java中Volatile关键字如何影响ArrayList在多线程环境下的可见性,揭示了Volatile仅保证引用本身而非内部元素的可见性,并通过额外的volatile标记和Atomic包的使用提供了解决方案。

420

被折叠的 条评论
为什么被折叠?



