Java 写时复制和交换后比较的区别?
我正在学习Java并发集合(Java 写时复制和交换后比较的区别?,java,multithreading,collections,concurrency,thread-safety,Java,Multithreading,Collections,Concurrency,Thread Safety,我正在学习Java并发集合(Java.util.Concurrent)和使用的底层技术。我在写、比较和交换时偶然发现了副本 我不太明白这两者之间的区别。或者两者以某种方式一起使用?两者都是并发集合,但它们使用不同的机制 写时拷贝集合使用一个有效的不可变数组,任何修改都会创建一个新数组。在创建新阵列期间,它们会短暂地使用同步。如果读操作在很大程度上主导了写操作,则它们是好的 相反,其他一些并发集合使用比较和交换(所谓的CAS)机制进行并发控制。这是基于低级CPU指令构建的,这是对传统同步的根本改进
Java.util.Concurrent
)和使用的底层技术。我在写、比较和交换时偶然发现了副本
我不太明白这两者之间的区别。或者两者以某种方式一起使用?两者都是并发集合,但它们使用不同的机制 写时拷贝集合使用一个有效的不可变数组,任何修改都会创建一个新数组。在创建新阵列期间,它们会短暂地使用同步。如果读操作在很大程度上主导了写操作,则它们是好的
相反,其他一些并发集合使用比较和交换(所谓的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等都是通过创建底层数组的新副本来实现的。我认为说“两者都是并发集合”是不正确的。它们当然是实现线程安全性和操作原子性的不同技术。CopyOnWriteArrayList绝对是Collection的一个具体实现。