- Clojure 教程
- Clojure - 首页
- Clojure - 概述
- Clojure - 环境
- Clojure - 基本语法
- Clojure - REPL
- Clojure - 数据类型
- Clojure - 变量
- Clojure - 运算符
- Clojure - 循环
- Clojure - 决策
- Clojure - 函数
- Clojure - 数字
- Clojure - 递归
- Clojure - 文件 I/O
- Clojure - 字符串
- Clojure - 列表
- Clojure - 集合
- Clojure - 向量
- Clojure - 映射
- Clojure - 命名空间
- Clojure - 异常处理
- Clojure - 序列
- Clojure - 正则表达式
- Clojure - 断言
- Clojure - 解构
- Clojure - 日期和时间
- Clojure - 原子
- Clojure - 元数据
- Clojure - StructMaps
- Clojure - 代理
- Clojure - 观察者
- Clojure - 宏
- Clojure - 引用值
- Clojure - 数据库
- Clojure - Java 接口
- Clojure - 并发编程
- Clojure - 应用
- Clojure - 自动化测试
- Clojure - 库
- Clojure 有用资源
- Clojure - 快速指南
- Clojure - 有用资源
- Clojure - 讨论
Clojure - 原子
原子是 Clojure 中一种数据类型,提供了一种管理共享、同步、独立状态的方式。原子就像任何其他编程语言中的任何引用类型一样。原子的主要用途是保存 Clojure 的不可变数据结构。原子保存的值使用swap! 方法更改。
在内部,swap! 读取当前值,将函数应用于它,并尝试对其进行比较并设置。由于另一个线程可能在间隔时间内更改了该值,因此它可能需要重试,并且在自旋循环中这样做。最终效果是,该值将始终是将提供的函数应用于当前值的原子结果。
示例
原子是在 atom 方法的帮助下创建的。以下程序显示了一个示例。
(ns clojure.examples.example (:gen-class)) (defn example [] (def myatom (atom 1)) (println @myatom)) (example)
输出
上述程序产生以下结果。
1
使用 @ 符号访问原子的值。Clojure 有几个可以在原子上执行的操作。以下是这些操作。
序号 | 操作和描述 |
---|---|
1 | reset!
将原子的值设置为新值,而不管当前值是什么。 |
2 | compare-and-set!
当且仅当原子的当前值与原子保存的旧值相同,才将原子的值原子地设置为新值。如果设置成功,则返回 true,否则返回 false。 |
3 | swap!
基于特定函数,原子地将原子的值与新值交换。 |
广告