Scala中Clojure的并发原语的真正替代品

haw*_*eye 4 concurrency scala clojure

在Clojure中,我有四个原语来管理并发场景

  1. Refs - 管理对共享状态的协调,同步更改
  2. 原子 - 管理对共享状态的不协调的同步更改
  3. 代理 - 管理对共享状态的异步更改
  4. Vars - 管理线程本地状态

我的问题是 - Scala中是否有成熟的等价物?

假设 - 我将假设:

  • 演员是解决代理人所遇问题的另一种方式 - 但他们并不意味着直接替代
  • 我知道Scala中有代理库 - 我很想知道它们是否被认为是成熟的

Dao*_*Wen 7

您为Clojure列出的大多数并发结构都基于软件事务内存.因此,我认为你基本上只是在询问Scala中的STM支持.根据Akka文档,Scala中STM的最佳选择是ScalaSTM,他们说它实际上将在未来的某个时间包含在Scala标准库中.

ScalaSTM支持代理和引用(我认为它实际上基于Clojure版本).我认为Atom的推论是Ref.single类型,它只是一个可以在atomic块之外使用的ref .

根据您的使用情况,可以替代varJava ThreadLocal或Scala DynamicVariable.ThreadLocal如果您想要的只是线程本地数据,请使用,但如果您确实需要动态绑定,那么我认为您需要DynamicVariable.

  • 实际上,只有Clojure Refs使用STM.原子不是事务性的,因为你不能原子地更新多个原子.他们不参与STM交易.代理稍微参与,但仅在任何代理程序调度被延迟直到事务成功完成的意义上.但是,如果代理操作失败,则不会导致事务失败.Vars提供线程局部值(动态变量是这种情况的特例).因此,每种类型都提供了一种不同的管理(可能并发)状态的方式,每种方式都有不同的用例. (2认同)