对于涉及共享变量
访问的操作,若该操作从其执行线程以外的任意线程来看是不可分割的
,那么该操作就是原子操作,称该操作具有原子性
实现原子性的两种方式:
- 使用锁(Lock)
- 利用CAS(Compare and Swap) 直接在硬件(处理器、内存)这一层次实现,又被称为“硬件锁”
在Java中,对基础数据类型(除double、long以外)的变量
和引用变量
的写操作
都是原子性
的
Java中的double、long类型变量会占用64位(8字节)的存储空间,32位的Java虚拟机对这种变量的写操作可能会分解为两个步骤实施,比如先写低32位,后写高32位,故不能保证原子性
Java中对任何变量的读操作都是原子性的
Java语言规范特别地规定对于volatile
关键字修饰的long/double
类型变量的写操作
是具有原子性的
可以使用synchronized关键字来保证操作的原子性
原子操作 + 原子操作 != 原子操作