首先看下如下代码:

指令重排序和优化后代码如下:
if(!stop)
while(true){}
volatile最适合使用的是一个线程写、其他线程读的场合,如果有多个线程并发写操作,仍然需要使用锁或者线程安全的容器或者原子变量来代替。

当一个变量被volatile修饰后,它将具备以下两种特性。
· 线程可见性:当一个线程修改了被volatile修饰的变量后,无论是否加锁,其他线程都可以立即看到最新的修改,而普通变量却做不到这点。
禁止指令重排序优化,普通的变量仅仅保证在该方法的执行过程中所有依赖赋值结果的地方都能获取正确的结果,而不能保证变量赋值操作的顺序与程序代码的执行顺序一致。

转载于:https://www.cnblogs.com/htkj/p/10932558.html

指令重排序所带来的问题及使用volatile关键字解决问题相关推荐

  1. java volidate线程安全_03.(多线程与并发)面试题-02--Volidate的原理和指令重排序

    线程栈(线程的工作内存)保存了线程运行时候变量值信息.当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本 ...

  2. Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)

    一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...

  3. 【Java 并发编程】指令重排序规范 ( happens-before 先行发生原则 )

    文章目录 一.指令重排序规范 二.happens-before 先行发生原则 一.指令重排序规范 指令重排指的是 , 线程中如果两行代码 没有逻辑上的上下关系 , 可以对代码进行 重新排序 ; JVM ...

  4. 【Java 并发编程】线程指令重排序问题 ( 指令重排序规范 | volatile 关键字禁止指令重排序 )

    文章目录 总结 一.指令重排序规范 二.指令重排序示例 总结 Java 并发的 333 特性 : 原子性 : 每个操作都是 不可拆分的原子操作 ; 在线程中进行 a++ 就不是原子操作 , 该操作分为 ...

  5. 说说Java中原子性,可见性与指令重排序的理解

    原子性:就是读数据,处理数据,写数据 这三个步骤不能被终止,或者打断:就是不能被线程调度器中断,切换线程. 这样,才能保证,原子操作在线程切换,并行处理上保证数据地顺序累加处理. 可见性:是Jvm较为 ...

  6. Java之volatile如何保证可见性和指令重排序

    1 我们先了解CPU缓存 CPU缓存为了解决CPU运算速度与内存读写速度不匹配的问题,因为CPU运算速度要比内存读写速度快得多 一次主内存的访问通常在几十到几百个时钟周期 一次L1高速缓存的读写只需要 ...

  7. JVM学习--(二)内存模型、可见性、指令重排序

    我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再 ...

  8. 指令重排序及Happens-before法则随笔

    指令重排序 对主存的一次访问一般花费硬件的数百次时钟周期.处理器通过缓存(caching)能够从数量级上降低内存延迟的成本这些缓存为了性能重新排列待定内存操作的顺序.也就是说,程序的读写操作不一定会按 ...

  9. 【java】java如何证明java发生了指令重排序

    1.概述 package com.java.memory.commondsort;/*** @author: chuanchuan.lcc* @date: 2020-12-20 19:37* @mod ...

最新文章

  1. 3详细参数_【前沿】一加7Pro拍照详细参数曝光 3倍光变30W快充
  2. 【Groovy】map 集合 ( map 集合定义 | 通过 getClass 函数获取 map 集合的类型 | 代码示例 )
  3. 模拟退火算法通俗讲解
  4. 理解 pkg-config 工具
  5. wx.navigateTo的url不生效的问题
  6. matlab求数的因子,matlab中因子分析的函数factoran如何使用??
  7. 预训练模型的下一步?突破Impossible Triangle
  8. 开源程序安装框架-BitNami
  9. CDA LEVELⅠ2021新版模拟题一(附答案)
  10. 【Css/Html】网页Css默认设计样式载入模板代码body.css
  11. AcWing 2019. 拖拉机
  12. 猫怎么设置虚拟服务器,光纤猫设置虚拟服务器
  13. AUTOCAD——遮罩命令、如何使用CAD对图纸进行局部放大
  14. java start with_Java中startWith方法的使用!
  15. deepin 蓝牙适配器 安装
  16. 2019年终总结---在前端的成长
  17. excel 区间人数柱状图_『excle 图表 区间计数』excel如何把学生成绩区间分布统计为柱状图...
  18. sin函数对照表_常见三角函数值对照表
  19. linux中从内存解析xml格式的库,Linux下使用libxml库解析xml文件
  20. 微软Microsoft Office 2016 (word、excel、ppt三件套)安装问题及解决过程记录

热门文章

  1. (计算机组成原理)第二章数据的表示和运算-第三节2:IEEE754标准
  2. 3-7:类与对象下篇——static成员
  3. C++设计模式-Builder建造者模式
  4. USACO-Section1.5 Arithmetic Progressions(枚举)
  5. Python 域名转IP(可包含http、https)
  6. python3+requests:get、post请求(python get、post)
  7. 公共情报工具automater的基本使用
  8. 【glibc源码分析】--strcpy.c 字符串复制
  9. java 连接IBM MQ的方法和常见问题
  10. ifram嵌入网址 有跨域问题