java - Java中List有内存屏障吗?

标签 java concurrency

由于 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/

相关文章:

java - 从文本文件中读取并查找字符串

concurrency - 来自 fanIn 示例的 golang 并发模式

java - 为什么 Java 不附带 CopyOnWriteMap?

java - MySQL导入现有数据库

java - 缺少 cxf jar : Please select the cxf home directory

java - 如何在循环中使用paintComponent?

java - 没有关键工作volatitle,如何实现DCL?

Mysql手动自增并发连接数证明

asp.net - 在 Entity Framework 中删除对象时的并发性

java - 创建具有不同 Intent 的多个通知