一:Volatile 变量具有synchronized的可见性,有序性 特性,但是不具备原子特性
二:java memory model(jmm) java 内存模型形象理解见下图
Java Memory Model
a:java 线程读取共享内存变量流程:
线程2 --> JMM 读取共享内存变量---> 放到本线程2工作内存中---> 线程2读取工作内存中的变量进行使用。
b:java 线程修改共享内存变量流程:
线程2--> 修改本线程工作内存中的变量-->jmm 自动把线程2的工作内存中的 修改过的 共享变量读取出来
去同步共享内存变量(备注:1.同时会通知其他线程共享内存变量已经改变,2: 其他线程中工作内存的共享变量失效。也就是说线程1 要使用共享变量,必须重新读取 共享内存变量到 本地工作内存)
c: 总结线程使用并修改共享内存变量流程:
读取(共享变量)-->操作(+-*% 共享变量)-->同步(共享变量)
三: volidate 关键字的作用:
读取(共享变量)-->操作(+-*% 共享变量)-->加锁-->同步(共享变量)
备注: jmm 根据线程2的工作内存 中的共享变量 去 同步 共享内存中的 共享变量之前加了一把锁。
这个动作之前,线程1可以对 自己工作内存中的共享变量 修改,但jmm 要去同步线程2对共享内存修改的时刻,
通知线程1中的 本地内存 共享变量 失效, 导致线程1 对本地工作内存 中的变量修改失效。这种情形就是 非原
子性操作了。