2017-04-17 83 views
0

IIUC,一个Collection只有一个​​方法访问,应该是线程安全的 - 是吗?同步收集获取器

例如,

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

假设这吸气剂专门访问列表 - 所有操作都是通过getList() - 感觉就像它应该是线程安全的我 - 但我很高兴被告知我错了。

TYIA

+5

不可以。您正在返回对您的实际列表的引用。任何在某个时候获得清单的人都可以以非线程安全的方式自由修改其内容。 – Marvin

+0

如果您要返回列表,请将其作为一个简单的方法。同步不会在这里做任何魔术。并且您返回可以由任何人修改的列表的引用。 – vijayraj34

回答

1

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

+4

同意一般性声明,但不是建议。而不是Vector,使用由Collections.synchronizedList()包装的ArrayList。 – jtahlborn

+0

@jtahlborn我同意,根据OP试图达到的目标,“Vector”不是最好的选择。 –

+0

'矢量'已经过时十九年了。还有很长的一段时间仍然推荐它。不要使用'Vector'。 –

0

更好的你去的CopyOnWriteArrayList,如果你有比写更读,因为它的同步,也的CopyOnWriteArrayList的迭代器是故障安全也不抛出ConcurrentModificationException的

您也可以使用Collections.synchronizedList(名单)同步的现有列表中,但迭代器将是快速失败的