对volatile理解
是虚拟机提供的轻量级的同步机制
可见性,禁止指令重排,不保证原子性
如何解决原子性?
*加sync
*使用juc下的AtomicInteger
指令重排
源代码—编译器优化重排—指令并行重排—内存系统重排—最终执行的指令
禁止指令重排:避免多线程下程序出现乱序执行现象
内存屏障(Memory Barrier):内存栅栏,是一个CPU指令,两个作用::
一:保证特定的执行顺序,
在指令间插入一条内存屏障后编译器和处理器就不会对指令执行重排优化.
二:保证变量的内存可见性(这个特性实现了volatile的内存可见性)
,强制刷新个各种CPU的缓存数据,所以在CPU上的线程都读取到数据的最新版本
解决工作内存与主内存同步延迟导致的可见性问题?
*synchronized或volatile解决,他们都使一个线程改变变量后对其他线程可见
解决指令重排导致的可见性问题和有序性问题
volatile,
synchronized是加锁,加锁就是单线程,单线程怎样指令重排都可以
双端检锁机制+volatile
JMM(java内存模型)
jmm对同步的规定
1 线程解锁前,必须把共享变量的值刷新回主内存
2 线程加锁前,必须读取主内存的最新值到自己的工作内存
3 加锁解锁是用一把锁
java内存模型中规定所有变量都存储在主内存,主内存是共享区域,
线程对变量的操作必须在工作内存中,
首先将变量从主内存拷贝到自己的工作内存空间,
然后对变量操作,操作后写回主内存
一位前辈的话:
自己造不出好轮子,且有好轮子就不要重复造烂轮子
https://blog.youkuaiyun.com/u011521203/article/details/80230096