Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 写时复制和交换后比较的区别?_Java_Multithreading_Collections_Concurrency_Thread Safety - Fatal编程技术网

Java 写时复制和交换后比较的区别?

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

我正在学习Java并发集合(
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的一个具体实现。