【发布时间】:2020-06-23 12:02:57
【问题描述】:
我正在学习 Java 并发集合 (java.util.concurrent) 和使用的底层技术。我偶然发现了 Copy-On-Write 和 Compare-And-Swap。
我不太明白这两者之间有什么区别。或者两者都以某种方式一起使用?
【问题讨论】:
标签: java multithreading collections concurrency thread-safety
我正在学习 Java 并发集合 (java.util.concurrent) 和使用的底层技术。我偶然发现了 Copy-On-Write 和 Compare-And-Swap。
我不太明白这两者之间有什么区别。或者两者都以某种方式一起使用?
【问题讨论】:
标签: java multithreading collections concurrency thread-safety
两者都是并发集合,但它们使用不同的机制。
Copy-on-write 集合使用一个有效的不可变数组,任何修改都会创建一个新数组。在创建新阵列期间,它们会简单地使用同步。如果读操作在很大程度上占主导地位,它们就很好。
相反,其他一些并发集合使用 Compare-And-Swap(所谓的 CAS)机制进行并发控制。这是基于低级 CPU 指令构建的,这是对传统同步的根本改进。
【讨论】:
程序和并发算法中非常常见的模式是“检查然后行动”比较和交换 java.util.concurrent.atomic 包提供非阻塞的原子操作。
private AtomicBoolean locked = new AtomicBoolean(false);
public boolean lock() {
return locked.compareAndSet(false, true);
}
它会在内部检查旧值,如果没有更改,则使用新值更新。 在其他情况下 CopyOnWriteArrayListlike 是 java.util.ArrayList 的线程安全变体,其中所有可变操作 add 和 set 等都是通过制作底层数组的新副本来实现的。
【讨论】: