在高级 Java 集合 API 中,我们有 CopyOnWriteArrayList 和 ConcurrentHashMap。然而,这些数据结构的基本原理是不同的。即ConcurrentHashMap 只锁定发生写操作的Map 的一部分。这就是它在不影响性能的情况下防止同步问题的方式。
另一方面,CopyOnWriteArrayList 通过复制原始列表来防止并发问题。为什么这些实现如此不同?Java 只是测试看看哪个更好用吗?
在高级 Java 集合 API 中,我们有 CopyOnWriteArrayList 和 ConcurrentHashMap。然而,这些数据结构的基本原理是不同的。即ConcurrentHashMap 只锁定发生写操作的Map 的一部分。这就是它在不影响性能的情况下防止同步问题的方式。
另一方面,CopyOnWriteArrayList 通过复制原始列表来防止并发问题。为什么这些实现如此不同?Java 只是测试看看哪个更好用吗?
并发数据结构旨在确保对数据结构的任何单个操作序列始终使其处于从其自身角度来看是一致的状态,但是通过逐段读取数据结构形成的“快照”可能不一定代表数据结构曾经持有的任何状态。例如,如果在读出一组用户时,“Zachary”被重命名为“Adam”,则重命名的用户可能会被读出为“Adam”、“Zachary”,两者都有,或者都没有。即使在枚举过程中,集合从未处于用户从未以两个名称存在或不存在任何一个的状态,枚举也可能使它看起来像这样。
写时复制集合旨在让人们对集合的整个状态进行快照,并确保集合实际具有该状态的某个时刻。每个动作(包括快照请求)的结果应该与在发出请求和报告完成请求之间的某个离散时刻执行的每个动作一致。如果在任何一个完成之前给出了两个请求,那么选择哪个动作先于另一个动作是任意的,但必须有一个全局一致的顺序。