目录

java 内存模型

可见性和原子性

可见性

可见性指一个线程对某个变量更改后,是否对其他线程可见

可见的必要条件

  1. 线程A在自己的工作内存中对变量V做了修改
  2. 把修改后的变量V同步到主内存
  3. 线程B重主内存重新加载变量V (这时线程B才能看到线程A做的修改)

原子性

某个时刻,只允许一个线程修改某个共享变量

final 关键字

final关键字修饰的变量在各个线程间是可见的

volatile 关键字

volatile的可见性

volatile执行过程

  1. 每次读取共享变量时,强制从主内存读取最新的副本到工作内存
  2. 在工作内存中修改共享变量
  3. 共享变量修改后,强制刷新回主内存(所以每个线程在访问时候会读到最新值)

volatile 的原子性

可见要做到原子性,必须每个时刻只能有一个线程对该变量进行更新

volatile 不能像synchronized做到原子性,但是他的性能相对synchronized较高。那volatile可以在哪些场景下使用呢?当对变量只读,且修改时不依赖原值的情况下可以使用

synchronized 关键字

synchronized既能保证可见性,又能保证原子性

synchronized执行过程

  1. 获得互斥锁(加锁后,只有该线程有权执行,其他线程必须等待)
  2. 清空工作内存
  3. 从主内从拷贝最新副本到工作内存
  4. 执行代码
  5. 将更新后的值刷新回主内存
  6. 释放互斥锁