同步集合getter

时间:2017-04-17 17:25:41

标签: java multithreading collections

IIUC,只有Collection方法才能访问的synchronized应该是线程安全的 - 是吗?

如,

class Foo {
  private List<String> mList = new LinkedList<>();
  public synchronized List<String> getList() {
    return mList;
  }
}

假设这个getter使用独占来访问列表 - 所有操作都是通过getList() - 感觉它对我来说应该是线程安全的 - 但我很高兴能够告诉我错了。

TYIA

2 个答案:

答案 0 :(得分:1)

这很可能不够,因为它只返回List的引用;多个线程仍然可以同时修改它,从而导致竞争条件。如果您正在寻找完全同步的List,那么我建议您使用ArrayList包裹Collections#synchronizedList

答案 1 :(得分:1)

如果你有更多的读取而不是写入,那么你最好选择 CopyOnWriteArrayList ,因为它的同步以及 CopyOnWriteArrayList 的迭代器是失败安全并且不会抛出 ConcurrentModificationException

您还可以使用 Collections.synchronizedList(list)使现有列表同步,但Iterator将 Fail-Fast