volatile

CPU缓存

导致一致性问题

解决方案

1.总线加锁(粒度太大)

2.MESI

 a.读操作:不做任何事情,把Cache中的数据读到寄存器

 b.写操作:发出信号通知其他的CPU讲改变量的Cache line置为无效,其他的CPU要访问这个变量的时候,只能从内存中获取

java内存模型

volatile_第1张图片

  1. 主存中的数据所有线程都可以访问(共享数据)
  2. 每个线程都有自己的工作空间,(本地内存)(私有数据)
  3. 工作空间数据:局部变量、内存的副本
  4. 线程不能直接修改内存中的数据,只能读到工作空间来修改,修改完成后刷新到内存

volatile作用

可见性

对共享变量的修改,其他的线程马上能感知,但不能保证原子性

有序性

volatile之前的代码不能调整到它的后面

volatile之后的代码不能调整到它的前面

使用场景

状态标志(开关)

DCL

与synchronize的区别

使用上的区别

Volatile只能修饰变量,synchronized只能修饰方法和语句块

对原子性的保证

synchronized可以保证原子性,Volatile不能保证原子性

对可见性的保证

 

都可以保证可见性,但实现原理不同

Volatile对变量加了lock,synchronized使用monitorEnter和monitorexit  monitor  JVM

对有序性的保证

Volatile能保证有序,synchronized可以保证有序性,但是代价(重量级)并发退化到串行

其他

synchronized引起阻塞

Volatile不会引起阻塞

 

你可能感兴趣的:(并发)