IIUC,只有Collection
方法才能访问的synchronized
应该是线程安全的 - 是吗?
如,
class Foo {
private List<String> mList = new LinkedList<>();
public synchronized List<String> getList() {
return mList;
}
}
假设这个getter使用独占来访问列表 - 所有操作都是通过getList()
- 感觉它对我来说应该是线程安全的 - 但我很高兴能够告诉我错了。
TYIA
答案 0 :(得分:1)
这很可能不够,因为它只返回List
的引用;多个线程仍然可以同时修改它,从而导致竞争条件。如果您正在寻找完全同步的List
,那么我建议您使用ArrayList
包裹Collections#synchronizedList
。
答案 1 :(得分:1)
如果你有更多的读取而不是写入,那么你最好选择 CopyOnWriteArrayList ,因为它的同步以及 CopyOnWriteArrayList 的迭代器是失败安全并且不会抛出 ConcurrentModificationException 。
您还可以使用 Collections.synchronizedList(list)使现有列表同步,但Iterator将 Fail-Fast 。