Java并发问题 - 在集合上同步

Poo*_*ool 1 java concurrency multithreading 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我担心一个线程无法通过另一个线程看到更改.

Cha*_*tni 5

您的代码将起作用并且是线程安全的但不是并发的.你可能要考虑使用ConcurrentLinkedQueue或像其他并发线程安全的数据结构ConcurrentHashMapCopyOnWriteArraySet通过notnoop建议和使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您还应该考虑使用`ConcurrentHashMap`或`CopyOnWriteArraySet`,因为这会显着增加`find`操作 (2认同)