Multithreading 原子性和不变性是解决并发/并行编程中相同问题的两种截然不同的方法吗?

Multithreading 原子性和不变性是解决并发/并行编程中相同问题的两种截然不同的方法吗?,multithreading,concurrency,immutability,atomicity,Multithreading,Concurrency,Immutability,Atomicity,可以选择使用原子操作或不可变类型来设计并发/并行系统,这样说对吗?也就是说,原子操作导致设计原子共享状态的系统,而不可变类型导致设计避免一起共享的系统?这两种设计本质上是相互替代(解决相同的基本问题)还是解决不同的问题(意味着可能必须同时使用原子操作和不可变类型来设计完全并发安全的系统)?虽然这两个概念都与并发系统相关,两者都保证不会读取中间状态,它们非常不同,适合不同的场景。例如,迭代不可变的数据结构可以保证正确和“安全”的迭代,而可变的数据结构对于迭代来说是不安全的,即使变异操作是原子的。另

可以选择使用原子操作或不可变类型来设计并发/并行系统,这样说对吗?也就是说,原子操作导致设计原子共享状态的系统,而不可变类型导致设计避免一起共享的系统?这两种设计本质上是相互替代(解决相同的基本问题)还是解决不同的问题(意味着可能必须同时使用原子操作和不可变类型来设计完全并发安全的系统)?

虽然这两个概念都与并发系统相关,两者都保证不会读取中间状态,它们非常不同,适合不同的场景。例如,迭代不可变的数据结构可以保证正确和“安全”的迭代,而可变的数据结构对于迭代来说是不安全的,即使变异操作是原子的。另一方面,对共享/中心数据存储进行原子变异可以保证不会读取错误的数据,而不变性则无关紧要,因为存储必须更改

可以选择使用原子操作或不可变类型来设计并发/并行系统,这样说对吗

对我来说,这似乎有点像是被迫的争论。在您给出的示例中,这两个概念似乎是相关的,但只是微不足道。我认为这两个不同的概念都有助于实现和优化并发/并行体系结构

这两种设计本质上是相互替代(解决相同的基本问题)还是解决不同的问题(这意味着可能需要同时使用原子操作和不可变类型来设计完全并发安全的系统)

它们当然不是“替代品”。我想说,原子性解决了并发系统的一个特定问题,但不变性更像是一个“好东西”

如果在并发线程之间锁定,则需要原子操作来执行(例如)测试、设置、解锁和等待操作,这些操作是共享数据和发送信号所必需的。可能还有其他方法可以在没有原子性的情况下实现这一点,但这可能会变得更加困难

不可变类型是并发/并行体系结构的一个标志,因为线程可以安全地共享数据,而无需担心修改。不变性还有助于数据可见性优化。但也就是说,不变性不是一项要求

也就是说,原子操作导致设计原子共享状态的系统,而不可变类型导致设计避免一起共享的系统

不是真的。原子性是指当线程更新如上所述的相同状态时避免争用条件,但是状态共享不一定是原子的


您当然可以在两个线程之间共享数据,而无需原子性或不可变类型。线程#1更新
State1
是所有线程共享的,线程#2更新
State2
也是共享的。

当然
ConcurrentHashMap
是可修改的,所以我认为有些数据结构是不安全的。为什么这么多人认为函数式语言(使用Clojure和Haskell等不可变类型)在某种程度上比其他具有良好原子库支持的语言(如Java和c/c++)更适合并发性?一个好的原子库不会消除并发编程中的所有潜在问题吗?语言参数本质上是宗教性的@Hasting_squid。当然,不可变性会让事情变得复杂“更好”和在许多并发情况下更优化。但更多的是关于好的编程模式,而不是关于并发的需求。