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

时间:2017-06-23 19:35:29

标签: multithreading concurrency immutability atomicity

说可以选择使用原子操作或使用不可变类型设计并发/并行系统是否正确?即原子操作导致设计一个原子共享状态的系统,而不可变类型导致设计一个避免共享的系统?这两个设计本质上是相互替代的(解决相同的底层问题)还是它们解决了不同的问题(意味着可能必须同时使用原子操作和不可变类型来设计完全并发安全的系统)?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

  

说可以选择使用原子操作或使用不可变类型设计并发/并行系统是否正确?

这似乎有点像是对我的强迫论证。在你给出的例子中,似乎这两个概念是相关的,但只是十分有效。我要说这两个不同的概念都有助于实现和优化并发/并行架构。

  

这两个设计本质上是相互替代的(解决相同的底层问题)还是它们解决了不同的问题(这意味着可能必须同时使用原子操作和不可变类型来设计完全并发安全的系统) ?

他们肯定不是“替代品”。我会说原子性解决了并发系统的一个特定问题,但不变性更像是一个“很好的”。

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

不可变类型是并发/并行体系结构的标志,因为线程可以安全地共享数据而无需担心修改。不可变性还有助于数据可见性优化。但话虽如此,不可变性不是必需的。

  

即。原子操作导致设计一个原子共享状态的系统,而不可变类型导致设计一个避免全部共享的系统?

不是真的。当线程正在更新与上述相同的状态时,原子性是关于避免竞争条件,但是状态的共享不一定是原子的。

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