Clojure 的 Atom 在 Scala 中相当于什么?

2024-04-05

Clojure 有一个原子 http://clojure.org/atoms for 以同步且独立的方式改变线程之间的状态 http://clojure.org/concurrent_programming, 这不是 STM 的一部分 https://stackoverflow.com/a/18976545/15441. You 像这样使用它 http://clojuredocs.org/clojure_core/clojure.core/atom:

user=> (def my-atom (atom 0))
#'user/my-atom

user=> @my-atom
0

user=> (swap! my-atom inc)
1

user=> @my-atom
1

user=> (swap! my-atom (fn [n] (* (+ n n) 2)))
4

我的问题是:Clojure 的 Atom 在 Scala 中相当于什么?


正如 @Shepmaster 和 @om-nom-nom 所说,它是一个包装器java.util.concurrent.atomic.Atomic....

等效的包装器可能如下所示:

import java.util.concurrent.atomic._
import scala.annotation.tailrec

object Atom {
  def apply[A](init: A): Atom[A] = new Impl(new AtomicReference(init))

  private class Impl[A](state: AtomicReference[A]) extends Atom[A] {
    def apply(): A = state.get()
    def update(value: A): Unit = state.set(value)
    def transformAndGet(f: A => A): A = transformImpl(f)

    @tailrec private final def transformImpl(fun: A => A): A = {
      val v    = state.get()
      val newv = fun(v)
      if (state.compareAndSet(v, newv)) newv
      else transformImpl(fun)
    }
  }
}
trait Atom[A] {
  def apply(): A
  def update(value: A): Unit
  def transformAndGet(f: A => A): A
}

Ex:

val myAtom = Atom(0)
myAtom()  // --> 0
myAtom.transformAndGet(_ + 1) // --> 1
myAtom()  // --> 1
myAtom.transformAndGet(_ * 4) // --> 4

如果你使用Scala-STM http://nbronson.github.io/scala-stm/,该功能内置于 STM 参考中,通过使用.single view:

scala> import scala.concurrent.stm._
import scala.concurrent.stm._

scala> val myAtom = Ref(0).single
myAtom: scala.concurrent.stm.Ref.View[Int] = 
        scala.concurrent.stm.ccstm.CCSTMRefs$IntRef@52f463b0

scala> myAtom()
res0: Int = 0

scala> myAtom.transformAndGet(_ + 1)
res1: Int = 1

scala> myAtom()
res2: Int = 1

scala> myAtom.transformAndGet(_ * 4)
res3: Int = 4

优点是Ref.apply已经为您提供了原始类型的专用单元格,例如Int代替AnyRef(盒装)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Clojure 的 Atom 在 Scala 中相当于什么? 的相关文章

  • 运行外部进程的非阻塞线程

    我创建了一个 Java GUI 应用程序 它充当许多低级外部进程的包装器 该实用程序按原样运行 但迫切需要一项重大改进 我希望我的外部进程以非阻塞方式运行 这将允许我并行服务其他请求 简而言之 我希望能够在生成数据时处理来自外部进程的数据
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • 强制类型差异

    在 Scala 中 我可以在编译时强制执行类型相等 例如 case class Foo A B a A b B implicit ev A B scala gt Foo 1 2 res3 Foo Int Int Foo 1 2 scala
  • collect_list() 是否保持行的相对顺序?

    想象一下我有以下 DataFrame df id featureName featureValue id1 a 3 id1 b 4 id2 a 2 id2 c 5 id3 d 9 想象一下我运行 df groupBy id agg coll
  • 什么是竞争条件?

    编写多线程应用程序时 最常见的问题之一是竞争条件 我向社区提出的问题是 竞赛条件是什么 你如何检测它们 你如何处理它们 最后 如何防止它们发生 当两个或多个线程可以访问共享数据并且它们试图同时更改它时 就会出现竞争条件 由于线程调度算法可以
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • 从不带破折号的字符串创建 UUID

    如何从不带破折号的字符串创建 java util UUID 5231b533ba17478798a3f2df37de2aD7 gt uuid 5231b533 ba17 4787 98a3 f2df37de2aD7 tl dr java u
  • scala:抽象类实例化?

    我怎么会实例化一个抽象类呢 abstract class A val a Int val a new A val a 3 或者是隐式创建了一些具体的类 那些大括号之后是做什么用的new A mean 这样 您就隐式扩展了A 你所做的是语法糖
  • 关闭长度未知的通道

    当不了解频道时我无法关闭频道 length package main import fmt time func gen ch chan int var i int for time Sleep time Millisecond 10 ch
  • Python `concurrent.futures`:根据完成顺序迭代 future

    我想要类似的东西executor map 除了当我迭代结果时 我想根据完成的顺序迭代它们 例如首先完成的工作项应该首先出现在迭代中 等等 这样 当且仅当序列中的每个工作项尚未完成时 迭代就会阻塞 我知道如何使用队列自己实现这一点 但我想知道
  • Spark SQL中如何按列降序排序?

    I tried df orderBy col1 show 10 但它是按升序排列的 df sort col1 show 10 也按升序排序 我查看了 stackoverflow 发现的答案都已过时或称为 RDD https stackove
  • 为什么在构造函数中设置字段是(或不是)线程安全的?

    假设您有一个像这样的简单类 class MyClass private readonly int a private int b public MyClass int a int b this a a this b b public int
  • 从另一个线程在主线程中运行代码

    在 android 服务中 我创建了线程来执行一些后台任务 我遇到一种情况 线程需要在主线程消息队列上发布某些任务 例如Runnable 有没有办法得到Handler主线程和帖子的Message Runnable从我的另一个线程到它 注意
  • C++11:atomic::compare_exchange_weak 是否支持非原始类型?

    我有以下代码 include
  • 什么是“非阻塞”并发?它与普通并发有何不同?

    什么是 非阻塞 并发 它与使用线程的普通并发有何不同 为什么不在所有需要并发的场景中都使用非阻塞并发呢 使用非阻塞并发有开销吗 我听说Java中可以实现非阻塞并发 我们是否应该在特定场景下使用此功能 将这些方法之一与集合一起使用是否有区别或
  • 多线程读取xml文件

    我进行了很多搜索 但找不到适合我的问题的解决方案 我编写了一个 xml 文件 其中包含电视节目的所有剧集信息 它大小 38 kb 包含大约 680 个变量的属性和字符串 起初 我只是在 XMLTextReader 的帮助下阅读它 它在我的四
  • 为什么我的代码在 Spark Pregel 中执行需要很长时间?

    我在 Spark 中使用 Pregel 编写了处理图形的代码 但对于小数据集来说 它的执行速度非常非常慢 我以前用pregel写过程序 但是这段代码运行速度确实很慢 我的集群由 2 个工作人员组成 每个都有核心 i5 CPU 和 6 GB
  • 无法使用 Spark 结构化流在 Parquet 文件中写入数据

    我有一个 Spark 结构化流 val df spark readStream format kafka option kafka bootstrap servers localhost 9092 option startingOffset
  • 你能在 Clojure 中获取加载函数的“代码即数据”吗?

    换一种方式 好吧 代码就是数据 http groups google com group clojure browse thread thread 554cdc59d8a46f01 该线程解决了如何从源文件中读取的问题 但我想知道如何将已加
  • “gi.repository.Gtk”对象没有属性“gdk”

    我正在尝试使用 GTK 创建多线程 需要 Gtk gdk 但我收到有关没有 gdk 属性的错误 我正在使用带有 Raspbian 的 Raspberry Pi 这就是我导入 GTK 库的方式 try import pygtk pygtk r

随机推荐

  • 调试 javascript 有哪些好的技巧? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 所以我相当经常地使用 JavaScr
  • 关于C++类中typedef函数的疑问

    我需要定义一个返回类对象的函数 假设我有一个名为狗的类 h 中的类声明和 cpp 中的实现 当狗死时 我想调用一个函数让狗管理器知道这一点 在dog的SetFunc中我将收到要调用的函数 Dog h class Dog public typ
  • 从插件 (.so) 加载 Qt UI(带图像)时遇到问题

    我有一个插件 可以加载并显示一个自定义小部件 该小部件显示从资源文件 resources qrc 加载的图像 作为 QLabel 的背景 我面临的问题是 加载插件后 它会正确显示小部件 但不显示图像 我尝试将 Q INIT RESOURCE
  • Safari 上的 Flex-wrap 问题

    我试图让两个元素填充其容器并在达到某个最小尺寸时进行包装 我的代码在除 safari 之外的所有浏览器上都能完美运行 而且我无法找到替代方案 这似乎是 flex basis 0 的问题 问题是这样的 http www cssdesk com
  • 错误:“grep:参数列表太长”[重复]

    这个问题在这里已经有答案了 我正在尝试运行以下命令 但出现参数太长错误 你能帮我吗 HOST grep rl pattern home public html bash bin grep Argument list too long 有没有
  • Hadoop - 如何收集没有值的文本输出

    我正在从事地图缩减工作 我想知道是否可以向我的输出文件发出自定义字符串 没有计数 没有其他数量 只有一团文本 这是我正在思考的基本想法 public static class Map extends MapReduceBase implem
  • VueJS 和 Laravel 的 Textarea v-model 初始值

    我想使用刀片语法将用户名显示为 Markdown 编辑器的默认文本区域值
  • 自动滚动 JavaFX TextFlow

    我有一个 JavaFXTextFlow包裹在一个ScrollPane 我试图让它在有新内容时自动滚动到底部Text被添加到TextFlow 我尝试过附加监听器以最大化ScrollPane s vvalue to The ScrollPane
  • Rails 包含查询,其条件不返回左表中的所有结果

    我有两个表格 帖子和图像 以下是 schema rb 中的相关部分 create table posts force true do t t string name t string body t datetime created at t
  • 更新张量流中的张量切片

    我想更新 3 维张量的切片 下列的如何在 Tensorflow 中进行切片分配 https stackoverflow com questions 39157723 how to do slice assignment in tensorf
  • 我可以使用QTimer来实现多线程算法吗?

    目前我需要实现一个基于Qt的多线程算法 也许我应该尝试延长QThread 但在此之前 我想问一下 我是否可以只使用两个QTimers timer1 timer2 并将它们的超时信号分别连接到线程上 来实现一个 假 的多线程程序 您可以连接
  • WCF 中的两个接口和一个具体类

    请检查下面的示例 namespace GServices ServiceKnownType typeof SearchType ServiceContract SessionMode SessionMode Allowed public i
  • 组合两张地图

    Scala 中是否有一个函数可以组合两个映射 或者 flatMap 是一个明智的方法吗 scala gt val caps Map String Int Map A 1 B 2 caps Map String Int Map A gt 1
  • tinypng.org 如何压缩 PNG 文件? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 http tinypng org http tinypng org 是一项很棒的服务 他们将我的 png 图像优化了约 67 他们的服务如何运作 他们
  • React.js使用axios将数据发布到php,但php echo为空

    我正在使用react js axios和PHP将数据发布到MySQL数据库 这是我的react js代码 sendData var data new FormData data append name jessie data append
  • 如何开发依赖的 Composer 包而不需要提交或发布更改?

    我有一个应用程序 A 它有一个composer json 文件 定义了对包 P 的依赖关系 这是我自己的新闪亮包 我的包 P 有一个composer json 文件 它定义了对库 L 和框架 F 的依赖关系 我的包 P 还没有远程存储库 并
  • 如何在 Kubernetes 中模仿“--volumes-from”

    我正在寻找一种模式 允许在 Kubernetes 中同一 Pod 上运行的两个容器之间共享卷 我的用例是 我有一个 Ruby on Rails 应用程序在 Docker 容器内运行 docker 镜像包含静态资源 app
  • 如何使 RawPrinterHelper 同时在 XPS_PATH 和 RAW 数据类型中工作?

    我在用原始打印机助手 http support microsoft com kb 322091 en us用于打印 它可以在 Windows 7 及之前的版本上正常运行 当我们使用安装在 Windows 8 电脑上的打印机进行尝试时 它不起
  • 如何防止两个相同类型的管道 jenkins 作业在同一节点上并行运行?

    我不想允许同一类型 同一存储库 的两个作业在同一节点上并行运行 我怎样才能在 Jenkinsfile 中使用 groovy 来做到这一点 中提供的答案https stackoverflow com a 43963315 6839445 ht
  • Clojure 的 Atom 在 Scala 中相当于什么?

    Clojure 有一个原子 http clojure org atoms for 以同步且独立的方式改变线程之间的状态 http clojure org concurrent programming 这不是 STM 的一部分 https s