我有一个关于简单ArrayList的问题,而不是synchronizedList或CopyOnWriteArrayList。可以使用多个线程来使用同步块或方法来安全地添加和获取元素吗?如果是的话:那个简单的ArrayList与synchronized块和synchronizedList之间有什么区别?
答案 0 :(得分:0)
是的,可以通过多个线程使用同步块或方法正确使用ArrayList。实际上,您检查了Collections.synchronizedList()的源代码,它也是如此。如果对同步方法或块使用相同的对象进行每种类型的访问(获取,添加,迭代等),则可以。
答案 1 :(得分:0)
如果您正确地保护对多线程程序的访问,您可以在多线程程序中使用几乎的每个类。毕竟,不可能使每一段代码都是线程安全的,因此应用程序必须在更高层次上实现线程安全。
使用synchronizedList
的结果时甚至是这种情况。此列表将同步每个方法调用,但需要多个调用的算法将在没有其他同步的情况下中断,包括简单的
if(!list.contains(x)) {
list.add(x);
}
因为这两个方法调用之间可能存在并发更新(这称为 check-then-act 反模式)。
因此,使用synchronized
块与ArrayList
并使用Collections.synchronizedList(new ArrayList<>())
的结果之间的区别在于synchronizedList
将在每个方法调用上应用同步,这将是不够的只要一个操作由多个调用组成,手动synchronized
块就可以完全控制何时进行同步以及哪些代码范围将被覆盖并且即使您使用Collections.synchronizedList
也是必要的......