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



如何使原子操作线程安全?我在维基百科关于线程安全的文章中读到过这个主题。但这篇文章并没有真正解释幕后的过程。换句话说,为什么线程a执行的"原子"操作不能被线程B中断?

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

使之成为现实的幕后魔法将因实现而异。出于并发性设计的目的,您所能依赖的是执行时全有或全无的保证。

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

他们不解释幕后发生的事情的原因是这是高度特定于实现的。例如,在实现平台上,它取决于可用的硬件指令来做这种事情。

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

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

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

比较设置是一条机器指令,所以不会中断。

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

"有趣的"原子操作是指那些直观上由2个或多个步骤组成,但作为一个不可分割的步骤实现的操作,例如,比较和设置;在32位机器上Volatile r/w

最新更新