由于 volatile 仅适用于变量引用,是否有办法使一个线程对 List 的写入(添加)对另一个线程可见?
我的代码有两个线程,一个线程A将很多项目推送到List,另一个线程B在线程A完成后读取List;两个线程通过 CountDownLatch 同步。当线程 B 读取 List 时,会出现多次这种情况,并非 List 中的所有项都可见。
我的代码看起来像(实际代码比这更复杂,下面的代码太简单,无法重现问题):
public class TestList {
@Test
public void test() throws InterruptedException {
int num = 1000;
final CountDownLatch latch = new CountDownLatch(1000);
final List<Integer> list = new ArrayList<Integer>();
for (int i=0; i<num; i++) {
final int finalI = i;
Thread t = new Thread(new Runnable() {
@Override
public void run() {
list.add(finalI);
latch.countDown();
}
});
t.start();
}
latch.await(1, TimeUnit.MINUTES);
System.out.println(list.size());
}
}
更新: 感谢您的所有回答。正如@MikeStrobel的声明,我终于意识到这不仅是内存可见性问题,而且是同步问题。所以解决方案应该是像Kevin所说的Collections#synchronizedList(...),或者synchronized关键字
最佳答案
关于java - Java中List有内存屏障吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25453917/