原子操作指的是在多线程编程中,不会被其他线程中断的操作,即这些操作在执行过程中要么全部完成,要么完全不执行。原子操作的特点包括:
不可分割性:
原子操作在执行过程中不会被其他线程的操作打断。
无需同步:
原子操作通常不需要使用锁(如synchronized关键字)来实现线程安全。
执行效率:
原子操作通常可以在一个CPU指令周期内完成,因此具有较高的执行效率。
常见的原子操作类型包括:
读写操作:对基本数据类型的读写操作,如int类型变量的读写,在许多平台上是原子的。
加减操作:如fetch-and-add和fetch-and-sub等操作可以作为原子操作。
比较并交换(CAS):比较内存位置的值,如果与期望值相同,则替换为新值。
在Java中,原子操作包括基本类型的赋值操作(除long和double类型之外)、引用类型的赋值操作以及java.concurrent.Atomic.*包中所有类的一切操作。
在操作系统层面,如Linux,原子操作可以通过Test-and-Set、Compare-and-Swap和Fetch-and-Add等操作实现。
处理器使用基于缓存加锁或总线加锁的方式来保证多处理器之间的原子操作。现代CPU几乎所有的CPU指令都支持CAS的原子操作。
原子操作是多线程编程中确保数据一致性和线程安全的重要手段