Java并发问题——在一个集合上同步

标签 java multithreading concurrency java-memory-model

以下同步 ArrayList 的代码片段能否在多线程环境中工作?

class MyList {
    private final ArrayList<String> internalList = new ArrayList<String>();

    void add(String newValue) {
        synchronized (internalList) {
            internalList.add(newValue);
        }
    }

    boolean find(String match) {
        synchronized (internalList) {
            for (String value : internalList) {
                if (value.equals(match)) {
                    return true;
                }
            }
        }

        return false;
    }
}

我担心一个线程无法看到另一个线程的更改。

最佳答案

您的代码可以工作并且是线程安全的但不是并发的。您可能需要考虑使用 ConcurrentLinkedQueue 或其他并发线程安全数据结构,如 ConcurrentHashMap 或 notnoop 建议的 CopyOnWriteArraySet 并使用 contains 方法。

class MyList {
    private final ConcurrentLinkedQueue<String> internalList = 
         new ConcurrentLinkedQueue<String>();

    void add(String newValue) {
        internalList.add(newValue);
    }

    boolean find(String match) {
        return internalList.contains(match);
    }
}

关于Java并发问题——在一个集合上同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2016511/

相关文章:

java - 使用 Java 通过 http 批量下载图像的好方法

java - 长线程安全吗?

java - 在运行过程中从 Java 项目中提取文件

c++ - 使用boost线程的多线程中的段错误(核心转储)

android - 如何使用通知和等待

java - Java中的 volatile 变量

java - 在同一个 try block 中锁定多个 ReentrantReadWriteLocks 是否安全?

java - Java打印BufferedImage时出现空白页

java - Android:SlidingLayer 事件监听器 Onclose

java - 需要帮助解析 Java 中的字符串