penglongli / blog

18 stars 1 forks source link

Java 的 volatile 与 atomic 包 #112

Open penglongli opened 6 years ago

penglongli commented 6 years ago

Java 的原子访问主要是主要是 volatile 关键字与 atomic 包下的类。

什么是原子操作?原子操作是一次有效地发生的动作,不能停止在中间:要么完全发生,要么根本不发生。

在 Java 中,每个线程都有一个单独的内存空间,称为工作内存,其用于保存线程执行操作的不同变量的值。在操作执行完成后,线程将更新后的变量值复制到主内存中,并从其它线程读取最新值。

类似于增量表达式:i++,其不是原子操作,i++ 首先需要把 i 读取到线程工作内存 → 操作 → 写入主内存。

但是对于读取和写入操作是原子的,使用 volatile 声明的变量,全部是直接访问主内存的(Atomic 包下的类其实就是对 volatile 的一次封装)。

参考文章:

Volatile 关键字

在多线程编程中,为了确保一致性行为需要遵循下边的规则:

volatile 关键字由于其直接访问 Main Memory 的,所以其能够确保数据更改的可见性,但其并不会提供互斥性。

对于“读多写少”的程序而言,使用 volatile 关键字能比使用同步锁的方式得到更快的速度。

Atomic

Java 的 Atomic 包下的所有对象均是基于 volatile 关键字