Java 为什么有线程安全收集的要求?
如果我们可以轻松地将非线程安全集合转换为线程安全集合,那么为什么需要线程安全集合呢 例如:我们可以使用Collections.synchronizedList()方法创建同步的ArrayList。Java 为什么有线程安全收集的要求?,java,jakarta-ee,collections,thread-safety,thread-synchronization,Java,Jakarta Ee,Collections,Thread Safety,Thread Synchronization,如果我们可以轻松地将非线程安全集合转换为线程安全集合,那么为什么需要线程安全集合呢 例如:我们可以使用Collections.synchronizedList()方法创建同步的ArrayList。 synchronizedList只需用独占锁包装所有方法。这对你来说可能太严格了。例如,您可能非常希望允许同时进行任意数量的并发读取操作(并且仅序列化写入)。专门的实现可以提供这一点 synchronizedList仅在其内部状态未损坏的意义上是线程安全的。这是你的申请。例如if(list.isEmp
只需用独占锁包装所有方法。这对你来说可能太严格了。例如,您可能非常希望允许同时进行任意数量的并发读取操作(并且仅序列化写入)。专门的实现可以提供这一点synchronizedList
仅在其内部状态未损坏的意义上是线程安全的。这是你的申请。例如synchronizedList
if(list.isEmpty())list.add(1)代码>即使在同步列表上也不是线程安全的。
也没有为您提供快照迭代。专门的实现可以添加更高级别的原子操作for(String x:list)
我们可以使用
Collections.synchronizedList()
方法创建同步的ArrayList
那么,为什么图书馆提供“并发”收藏类呢?这是因为其中一些类可以使用线程安全算法实现,特别是,这可能比使用互斥保护算法更有效或更安全
当然,正如其他人所指出的,对于您的应用程序来说,仅仅保护一个集合可能并不总是足够的。无论如何,您可能需要一个互斥体来保护与集合相关的其他一些数据
但是,如果无锁版本对您有帮助,那么好消息是它们已经存在了;如果它们没有帮助,那么好消息是您不必使用它们。因为有时您不希望每次访问列表时都进行同步,或者等待某人完成读/写。看看,f.e.
java.util.concurrent.CopyOnWriteArrayList
Collections.synchronizedList
阻止所有其他线程访问该列表。争用可能是不可接受的。还必须注意,Collections.synchronizedList
的内部属性是线程安全的。这并不一定意味着您的代码通过使用它将是线程安全的。