为什么原子操作被认为是线程安全的?

时间:2013-01-17 01:00:13

标签: java thread-safety atomic

原子操作如何成为线程安全的?我在Wikipedia's article on thread-safety中读到过这个主题。但这篇文章并没有真正解释幕后的过程。换句话说,为什么线程A执行的“原子”操作不能被线程B?

中断

3 个答案:

答案 0 :(得分:7)

原子操作将完成或根本不完成。其他线程将无法看到“正在进行”操作 - 它永远不会在部分完成状态下查看。这就是“原子”这个词在这种情况下的意思。

实现真实性的幕后魔术将因实施而异。出于并发设计的目的,您可以依赖的是执行中的全有或全无保证。

答案 1 :(得分:6)

  

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

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

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

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

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

答案 2 :(得分:1)

Compare-and-set是一条机器指令,因此不会被中断。

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

“有趣的”原子操作是直观地由2个或更多个步骤组成的操作,但实现为一个不可分割的步骤,例如,比较和设置;在32位机器上长时间的易失性r / w。