- 它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成
- 它会强制将对缓存的修改操作立即写入主存
- 如果是写操作,它会导致其他CPU中对应的缓存行无效
volatile
修饰之后的变量会加入读写屏障- 写屏障(sfence):保证在该屏障之前的,对共享变量的改动 , 都同步到主存当中
- 读屏障(lfence):保证在该屏障之后的, 对共享变量的读?。釉氐氖侵鞔嬷械淖钚率?
- 对 volatile 变量的写指令后会加入写屏障
- 对 volatile 变量的读指令前会加入读屏障
volatile
的用途像两阶段终止、单例双重锁等等:两阶段终止--volatile
@Logpublic class TwoPhaseStop {// 监控线程private Thread monitorThread;// 多线程共享变量 单线程写入(停止线程) 多线程读取 使用 volatileprivate volatile boolean stop = false;// 启动监控线程public void start() {monitorThread = new Thread(() -> {log.info("开始监控");while (true) {log.info("监控中");Thread currentThread = Thread.currentThread();if (stop) {log.info("正在停止");break;}try {log.info("正常运行");Thread.sleep(5000);} catch (InterruptedException e) {// sleep出现被打断异常后、被打断后会清除打断标记// 需要重新打断标记currentThread.interrupt();}}log.info("已停止");},"monitor");monitorThread.start();}// 停止监控线程public void stop() {stop = true;monitorThread.interrupt();}}
····下篇预告:synchronized 和 volatile 区别和底层原理
推荐阅读
- [CG从零开始] 4. pyopengl 绘制一个正方形
- 一文读懂Apache Geode缓存中间件
- 跳棋怎么玩(跳棋怎么玩新手入门)
- 跳跳棋怎么玩(跳棋怎么玩新手入门)
- [CG从零开始] 3. 安装 pyassimp 库加载模型文件
- 塔罗牌该怎样入门(塔罗入门禁忌)
- 网购的兔子怎么养(从小摊买的兔子怎么养)
- 企业运维 | MySQL关系型数据库在Docker与Kubernetes容器环境中快速搭建部署主从实践
- 如何0到1构建DevOps?
- 小米11Ultra发热严重_小米11Ultra发热严重官方回应