Open penglongli opened 6 years ago
Java 的原子访问主要是主要是 volatile 关键字与 atomic 包下的类。
什么是原子操作?原子操作是一次有效地发生的动作,不能停止在中间:要么完全发生,要么根本不发生。
在 Java 中,每个线程都有一个单独的内存空间,称为工作内存,其用于保存线程执行操作的不同变量的值。在操作执行完成后,线程将更新后的变量值复制到主内存中,并从其它线程读取最新值。
类似于增量表达式:i++,其不是原子操作,i++ 首先需要把 i 读取到线程工作内存 → 操作 → 写入主内存。
但是对于读取和写入操作是原子的,使用 volatile 声明的变量,全部是直接访问主内存的(Atomic 包下的类其实就是对 volatile 的一次封装)。
参考文章:
在多线程编程中,为了确保一致性行为需要遵循下边的规则:
volatile 关键字由于其直接访问 Main Memory 的,所以其能够确保数据更改的可见性,但其并不会提供互斥性。
对于“读多写少”的程序而言,使用 volatile 关键字能比使用同步锁的方式得到更快的速度。
Java 的 Atomic 包下的所有对象均是基于 volatile 关键字
Java 的原子访问主要是主要是 volatile 关键字与 atomic 包下的类。
什么是原子操作?原子操作是一次有效地发生的动作,不能停止在中间:要么完全发生,要么根本不发生。
在 Java 中,每个线程都有一个单独的内存空间,称为工作内存,其用于保存线程执行操作的不同变量的值。在操作执行完成后,线程将更新后的变量值复制到主内存中,并从其它线程读取最新值。
类似于增量表达式:i++,其不是原子操作,i++ 首先需要把 i 读取到线程工作内存 → 操作 → 写入主内存。
但是对于读取和写入操作是原子的,使用 volatile 声明的变量,全部是直接访问主内存的(Atomic 包下的类其实就是对 volatile 的一次封装)。
参考文章:
Volatile 关键字
在多线程编程中,为了确保一致性行为需要遵循下边的规则:
volatile 关键字由于其直接访问 Main Memory 的,所以其能够确保数据更改的可见性,但其并不会提供互斥性。
对于“读多写少”的程序而言,使用 volatile 关键字能比使用同步锁的方式得到更快的速度。
Atomic
Java 的 Atomic 包下的所有对象均是基于 volatile 关键字