java - 为什么像获取和添加这样的原子操作会返回被更改变量的旧值?

标签 java multithreading opengl atomic

我正在努力学习并更好地理解多线程,但我对获取和添加等原子函数的行为很着迷。在 fetch-and-add 的特定情况下,我的理解是一个值(假设 x 当前等于 5)被增加一个增量值(假设 3),结果和(8)被写入 x 的放在内存中,但返回旧值 (5)。

在不同的地方(如 OpenGL 的原子函数、Java 的 AtomicIntegers 以及更多领域)还有其他几个这样的函数具有类似的行为。但我不明白的是,为什么代码中的某个地方想要写入内存,但仍然返回它首先想要修改的值。任何人都可以帮助阐明这一点吗?

最佳答案

答案很简单。原子函数的本质是它们修改(在本例中为增量)在执行时的实际值,这可能与您的代码知道的值不同。

例子:

x = 5; // x is global
y = atomically_increment(x);
// what is y? 

现在,如果恰好在实际发生增量之前 x 恰好从 5 变为 6,则 y 等于 6,而 x 等于 9。

关于java - 为什么像获取和添加这样的原子操作会返回被更改变量的旧值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36484358/

相关文章:

java - 无法使用 Apache Jena 运行特定的 SPARQL 查询

Java SQL 查询,最有效的匹配列值检查?

c - 延迟两个线程之间的通信

objective-c - NSSplitView 中的 NSOpenGLView

java - 我想给 mysql 提供 JDBC 连接。我不希望在我的类(class) people() 中拥有数据值

java - 如何在 Mac OSX 上安装 Java 以允许版本切换?

java - 这是停止执行任务的正确方法吗

python - 在线程中使用 matplotlib 绘图

c++ - 在 visual studio 2010 和 c++ 中使用 OpenGL 绘制带有箭头的轴

macos - 将所有 NSWindows 捕获为事件图像,例如 Mac OS X 中的 Mission Control