为什么需要线程安全收集?

时间:2019-07-25 08:26:31

标签: java java-ee collections thread-safety thread-synchronization

为什么要轻松地将非线程安全的集合转换为线程安全,为什么需要线程安全的集合?

例如:我们可以使用Collections.synchronizedList()方法创建Synchronized ArrayList。

2 个答案:

答案 0 :(得分:3)

  • synchronizedList仅使用排他锁包装所有方法。这对您来说可能太严格了。例如,您可能非常想允许任何数量的并发读取操作同时进行(并且仅序列化写入操作)。一个专门的实现可以提供这一点。

  • synchronizedList仅在其内部状态没有损坏的意义上是线程安全的。 may not be enough供您的应用程序使用。例如,if (list.isEmpty()) list.add(1);即使在同步列表上也不是线程安全的。 for (String x: list)也不给您快照迭代。专门的实现可以添加更高级别的原子操作。

答案 1 :(得分:0)

  

为什么我们需要线程安全的集合...

您不需要它们,因为您已经指出

  

我们可以使用ArrayList方法来创建同步的Collections.synchronizedList()

那么为什么该库提供“并发”收集类?这是因为其中某些类可以使用线程安全算法来实现,尤其是 non-blocking algorithms 可能比使用互斥锁保护的算法更有效或更安全。

当然,正如其他人指出的那样,仅保护 collection 可能并不总是足以满足您的应用程序的需求。无论如何,您可能都需要一个互斥体来保护与该集合相关的其他一些数据。

但是,如果无锁版本对您有所帮助,那么好消息是它们已经存在;如果它们没有帮助,那么好消息是您不必使用它们。