volatile禁止指令重排理解和例子说明_volatile禁止重排序例子_崔西儿的博客-程序员秘密

技术标签: JUC  禁止指令重排  volatile  

计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排,一般分一下3种:


源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系统的重排 -> 最终执行的指令

  • 单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致。(单线程没有影响)
  • 处理器在进行重排序时必须考虑指令之间的数据依赖性。(int a=1; int b=0;   没有依赖,可以进行指令重排)
  • 多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测。

 程序:线程A修改 a=1, flag=true,线程B判断如果flag=true,a+=5,并且打印。

class A{
    int a = 0;
    boolean flag = false;

    public void testA(){
        //语句1
        a = 1;
        //语句2
        flag = true;
    }

    public void testB(){
        if (flag){
            a = a + 5;
            System.out.println(a);
        }
    }

    public static void main(String[] args) {
        A a = new A();
        new Thread(new Runnable() {
            @Override
            public void run() {
                a.testA();
            }
        },"A").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                a.testB();
            }
        },"B").start();
    }
}

 

由于可能进行指令重排序,A方法语句1和语句2可能反过来,语句2先执行。

方法A可能会出现下面的情况

通过加volatile可以禁止指令重排

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41566772/article/details/99688430

智能推荐

ubuntu DNS修改_ubuntu dns重置_orDream的博客-程序员秘密

一、第一种方法查看DNS,cat /etc/resolv.conf能够查看DNS,这个文件是链接到ll /etc/resolv.conf# /etc/resolv.conf -> /run/resolvconf/resolv.conf可见这个文件时链接到另一个文件的真实的原文件时:sudo vi /etc/resolvconf/resolv.conf....

html+css+javaScript实现炫酷烟花表白(云雾状粒子文字3D开场)[email protected]码住夏天-web网页设计的博客-程序员秘密

❉ html+css+javaScript实现炫酷烟花表白 (云雾状粒子文字3D动画自动切换,支持自定义文字动画切换特效)/ 程序员表白必备一年一度的/520情人节/七夕情人节/生日礼物/告白师妹/圣诞节/元旦节跨年/程序员表白,谁说我们程序猿不浪漫,马上要到520情人节了。当你在为女朋友买什么礼物犯愁的时候,不妨花...

js和jquery获取当前对象的子元素_baimi2022的博客-程序员秘密

开发中经常遇到需要获取ul下的il对象,个人总结了js和jquery的方法。HTML片断: <ul class="box"> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> &lt...

【数据结构】算法3.3 迷宫求解_Zelda256的博客-程序员秘密

#include<stdio.h>#include<string.h>#include<stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define STACK_INIT_SIZE 100 //存储空间初始分配量#de

Android 数据库知识回顾_斌林诚上的博客-程序员秘密

一、前言二、效果预览​三、数据库与框架的基础使用(1)第一道:原生数据库(2)第二道:LitePal框架(3)第三道:GreenDao框架四、总结五、Demo地址六、内容推荐一、前言1.菜鸟作者为什么要写这篇呢?——随GitHub上Android数据库框架日新月异,我们应该如何选择一个适合我们的数据库。当然一个好的数据库框架不仅可以提高我们...

RGB转换HSL,HSV及切割车牌_永远爱mai的博客-程序员秘密

目录HSL和HSV简介对比RGB与HSL HSV相互转换RGB-&gt;HSL HSVHSL-&gt;RGBHSV-&gt;RGB一、图片颜色转换1.转换为灰度图2.转化为HSV HSL二、车牌切割1.读取2.灰度化和二值化3.闭运算4.腐蚀(去掉螺丝孔带来的影响)5.切割保存链接HSL和HSV简介HSL和HSV都是一种将RGB色彩模型中的点在圆柱坐标系中的表示法。这两种表示法试图做到比基于笛卡尔坐标系的几何结构RGB更加直观。HSL(HSI)即色相、饱和度、亮度(英语:Hue, Saturatio

随便推点

css响应式网页设计:自适应屏幕宽度、移动页面开发技巧_css 默认网页75%大小_BraveSoul360的博客-程序员秘密

html响应式网页设计:自动适应屏幕宽度背景移动设备正超过桌面设备,成为访问互联网的最常见终端。于是,网页设计师不得不面对一个难题:如何才能在不同大小的设备上呈现同样的网页?手机的屏幕比较小,宽度通常在600像素以下;PC的屏幕宽度,一般都在1000像素以上(目前主流宽度是1366×768),有的还达到了2000像素。同样的内容,要在大小迥异的屏幕上,都呈现出满意的效果,并不是一件容易的事。...

LeetCode 208 实现 Trie (前缀树)_208. 实现 trie (前缀树)_zhaohoutao的博客-程序员秘密

实现 Trie (前缀树)struct Node { bool isWord = false; Node* child[26] = {};};class Trie { public: Node* root; /** Initialize your data structure here. */ Trie() { root = new Node(); } /**...

盘古开源顺势转型,开拓芯片市场_盘古开源的博客-程序员秘密

近年来,芯片产业快速发展,市场规模和技术水平都在不断提高。芯片是信息产业的核心之一。随着人工智能、智能制造、汽车电子、物联网、5G等为代表的新兴产业快速崛起,芯片成为我国信息技术发展的核心,被认为是科技领域的“新石油”。长期以来,由于芯片市场产业链的复杂性和发达国家的先发优势,导致我国在芯片领域处于薄弱地位。为了促进我国芯片产业的发展,国家出台了相关政策鼓励扶持芯片行业。盘古开源顺势而为,响应政府号召,以数据存储市场为核心,积极开拓芯片市场新领域。什么是芯片?芯片是一种集成电路,由大量的晶体管构成。

Linux操作系统常用log日志_flybirding1001的博客-程序员秘密

&#13;&#13;&#13; Linux操作系统常用log日志 &#13;&#13;&#13;&#13; &#13; &#13; &#13; &#13;...

SpringBoot:spring-boot-devtools在idea中实现热部署_张小菜在路上的博客-程序员秘密

springBoot对调试支持很好,修改之后可以实时生效1.修改pom文件&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-devtools&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;l...

UFT\QTP 12 即将发布!_qtp12新特性_TIB的博客-程序员秘密

据小道消息称HP将于最近发布UFT\QTP 12主要变化在:安装文件小些自动上传测试结果到ALMMac下的Safari浏览器支持支持所有浏览器的最新版本支持VS 2010与2012

推荐文章

热门文章

相关标签