5

原子操作如何使线程安全?我在Wikipedia 关于线程安全的文章中阅读了有关该主题的内容。但这篇文章并没有真正解释幕后的过程。换句话说,为什么线程 A 执行的“原子”操作不能被线程 B 中断?

4

3 回答 3

7

原子操作要么完成,要么根本不完成。其他线程将无法看到“进行中”的操作——它永远不会在部分完成状态下被查看。这就是“原子”一词在这种情况下的含义。

实现这一点的幕后魔力因实施而异。出于您的并发设计的目的,您可以依赖的只是执行的全有或全无保证。

于 2013-01-17T01:04:13.003 回答
6

但是他们并没有真正解释幕后的过程,换句话说,为什么线程 A 执行的原子操作不能被线程 B 中断?

他们没有解释幕后发生的事情的原因是这是高度特定于实现的。例如,它取决于可用于在实现平台上执行此类操作的硬件指令。

但你不应该担心这一点。您不应该关心如何实现原子性(例如不可中断性)。您应该简单地依赖 AtomicXxx 类 API 提供的保证,即某些操作将以原子方式运行,并基于这些保证构建更高级别的线程安全。

但请注意,AtomicXxx 类的原子性属性仅适用于单个操作。AtomicXxx 操作序列不会以原子方式执行,因此不会自动成为线程安全的。

简而言之,如果你使用 AtomicXxx 类来实现线程安全,你需要了解你在做什么

于 2013-01-17T01:06:25.167 回答
1

比较和设置是一条机器指令,因此不会被中断。

从这个意义上说,所有机器指令都是原子的,这不是很有趣。例如,简单的写入总是原子的。

“有趣”的原子操作是那些直观地由 2 个或多个步骤组成,但实现为一个不可分割的步骤的操作,例如 compare-and-set;32 位机器上 long 的 volatile r/w。

于 2013-01-17T02:14:56.730 回答