4-16-volatile关键字作用

文章目录
  1. 1. volatile(变量可见,禁止重排序)
    1. 1.1. 两种特性
      1. 1.1.1. 变量可见性
      2. 1.1.2. 禁止重排序
    2. 1.2. 比synchronized更轻量级的同步锁
    3. 1.3. 原理(不拷贝到cpu缓存,直接从内存读)
    4. 1.4. 使用场景(不保证i++,单纯boolean赋值,不依赖自身或其他变量)

volatile(变量可见,禁止重排序)

稍弱的同步机制,确保将变量的更新操作通知到其他线程。

两种特性

  1. 不会被缓存再寄存器或者对其他处理器不可见的地方。
  2. 读取volatile类型的变量时总会返回最新写入的值。

变量可见性

保证该变量对所有线程可见。可见性指当一个线程修改了变量值,那么新值对于其他线程是可以立即获取的。

禁止重排序

volatile禁止了指令重排。

比synchronized更轻量级的同步锁

  1. 访问volatile变量时不会执行加锁操作
  2. 所以不会使线程阻塞,更轻量的同步机制
  3. 适合一个变量被多个线程共享,线程直接给这个变量赋值。

原理(不拷贝到cpu缓存,直接从内存读)

image-20210714145453408

使用场景(不保证i++,单纯boolean赋值,不依赖自身或其他变量)

  1. 对单次读写操作保证原子性
  2. i++是读写两次操作,不能保证原子性
  3. 某些场景可以代替syn,但不能完全取代
  4. 例如:写操作不依赖当前值,单纯赋值boolean flag=true
  5. 不同volatile变量之间,不能互相依赖。只有真正独立于程序内其他内容时才能使用volatile。