并发编程三要素 (synchronized和Lock都具备,volatile有前两个):
有序性:执行顺序按照代码顺序来.(编译器优化导致有序性问题,volatile禁用优化);
可见性:一个线程对数据的修改,其他线程可见;(缓存导致可见性问题,volatile禁用缓存;)
原子性:一个或多个操作,全成功或者全失败 (i++;非原子操作:从主内存读取i到线程工作内存,进行+1,再把i写到主内存。)
volatile的特点:
1.编译器不优化,对变量的操作按照执行顺序执行。(有序性)
2.变量不缓存在寄存器中(所以不是线程私有),调用时从主存中读,改完强制刷到主存。(可见性)
3.不能保证线程安全(只有加锁/cas无锁自旋保证原子性)。(无原子性)
优:简单;不会阻塞;同步性能高于syn
缺:比syn更易出错;同步有前提:1.对变量的写操作不依赖当前值; 2.改变量不在其他变量的不变式中(eg:下界<上界)
使用时,必须独立于程序的其他内容
volatile的工作原理:
1.可见性:
- 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新到主内存中;
- 当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,直接从主内存中读取共享变量。
2.有序性: 内存屏障,禁止指令重排序。