【问题标题】:Difference between Copy-On-Write and Compare-Then-Swap?写时复制和比较然后交换之间的区别?
【发布时间】:2020-06-23 12:02:57
【问题描述】:

我正在学习 Java 并发集合 (java.util.concurrent) 和使用的底层技术。我偶然发现了 Copy-On-Write 和 Compare-And-Swap。

我不太明白这两者之间有什么区别。或者两者都以某种方式一起使用?

【问题讨论】:

    标签: java multithreading collections concurrency thread-safety


    【解决方案1】:

    两者都是并发集合,但它们使用不同的机制。

    Copy-on-write 集合使用一个有效的不可变数组,任何修改都会创建一个新数组。在创建新阵列期间,它们会简单地使用同步。如果读操作在很大程度上占主导地位,它们就很好。

    相反,其他一些并发集合使用 Compare-And-Swap(所谓的 CAS)机制进行并发控制。这是基于低级 CPU 指令构建的,这是对传统同步的根本改进。

    【讨论】:

    • 我认为说“两者都是并发收集”是不正确的。它们当然是实现线程安全和操作原子性的不同技术。 CopyOnWriteArrayList 绝对是 Collection 的具体实现。
    【解决方案2】:

    程序和并发算法中非常常见的模式是“检查然后行动”比较和交换 java.util.concurrent.atomic 包提供非阻塞的原子操作。

    private AtomicBoolean locked = new AtomicBoolean(false);
        public boolean lock() {
            return locked.compareAndSet(false, true);
        }
    

    它会在内部检查旧值,如果没有更改,则使用新值更新。 在其他情况下 CopyOnWriteArrayListlike 是 java.util.ArrayList 的线程安全变体,其中所有可变操作 add 和 set 等都是通过制作底层数组的新副本来实现的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-19
      • 2012-08-26
      • 1970-01-01
      • 2014-06-29
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      相关资源
      最近更新 更多