范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Java指令重排序在多线程环境下的应对策略

  一、前言
  指令重排在单线程环境下有利于提高程序的执行效率,不会对程序产生负面影响;在多线程环境下,指令重排会给程序带来意想不到的错误。
  本文对多线程指令重排问题进行复原,并针对指令重排给出相应的解决方案。 二、问题复原(一)关联变量
  下面给出一个能够百分之百复原指令重排的例子。 public class D {     static Integer a;     static Boolean flag;          public static void writer() {         a = 1;         flag = true;     }          public static void reader() {         if (flag != null && flag) {             System.out.println(a);             a = 0;             flag = false;         }     } } 1、结果预测
  reader方法仅在flag变量为true时向控制台打印变量a的值。
  writer方法先执行变量a的赋值操作,后执行变量flag的赋值操作。
  如果按照上述分析逻辑,那么控制台打印的结果一定全为1。 2、指令重排
  假如代码未发生指令重排,那么当flag变量为true时,变量a一定为1。
  上述代码中关于变量a和变量flag在两个方法类均存在指令重排的情况。 public static void writer() {     a = 1;     flag = true; }
  通过观察日志输出,发现有大量的0输出。
  当writer方法内部发生指令重排时,flag变量先完成赋值,此时假如当前线程发生中断,其它线程在调用reader方法,检测到flag变量为true,那么便打印变量a的值。此时控制台存在超出期望值的结果。 (二)new创建对象
  使用关键字new创建对象时,因其非原子操作,故存在指令重排,指令重排在多线程环境下会带来负面影响。 public class Singleton {     private static UserModel instance;          public static UserModel getInstance() {         if (instance == null) {             synchronized (Singleton.class) {                 if (instance == null) {                     instance = new UserModel(2, "B");                 }             }         }         return instance;     } }  @Data @AllArgsConstructor class UserModel {     private Integer userId;     private String userName; } 1、解析创建过程使用关键字new创建一个对象,大致分为一下过程: 在栈空间创建引用地址 以类文件为模版在堆空间对象分配内存 成员变量初始化 使用构造函数初始化 将引用值赋值给左侧存储变量 2、重排序过程分析
  针对上述示例,假设第一个线程进入synchronized代码块,并开始创建对象,由于重排序存在,正常的创建对象过程被打乱,可能会出现在栈空间创建引用地址后,将引用值赋值给左侧存储变量,随后因CPU调度时间片耗尽而产生中断的情况。
  后续线程在检测到instance变量不为空,则直接使用。因为单例对象并为实例化完成,直接使用会带来意想不到的结果。 三、应对指令重排(一)AtomicReference原子类
  使用原子类将一组相关联的变量封装成一个对象,利用原子操作的特性,有效回避指令重排问题。 @Data @NoArgsConstructor @AllArgsConstructor public class ValueModel {     private Integer value;     private Boolean flag; }
  原子类应该是解决多线程环境下指令重排的首选方案,不仅通俗易懂,而且线程间使用的非重量级互斥锁,效率相对较高。 public class E {     private static final AtomicReference ar = new AtomicReference<>(new ValueModel());          public static void writer() {         ar.set(new ValueModel(1, true));     }          public static void reader() {         ValueModel valueModel = ar.get();         if (valueModel.getFlag() != null && valueModel.getFlag()) {             System.out.println(valueModel.getValue());             ar.set(new ValueModel(0, false));         }     } }
  当一组相关联的变量发生指令重排时,使用原子操作类是比较优的解法。 (二)volatile关键字public class Singleton {     private volatile static UserModel instance;          public static UserModel getInstance() {         if (instance == null) {             synchronized (Singleton.class) {                 if (instance == null) {                     instance = new UserModel(2, "B");                 }             }         }         return instance;     } }  @Data @AllArgsConstructor class UserModel {     private Integer userId;     private String userName; } 四、指令重排的理解1、指令重排广泛存在
  指令重排不仅限于Java程序,实际上各种编译器均有指令重排的操作,从软件到CPU硬件都有。指令重排是对单线程执行的程序的一种性能优化,需要明确的是,指令重排在单线程环境下,不会改变顺序程序执行的预期结果。 2、多线程环境指令重排
  上面讨论了两种典型多线程环境下指令重排,分析其带来负面影响,并分别提供了应对方式。 对于关联变量,先封装成一个对象,然后使用原子类来操作 对于new对象,使用volatile关键字修饰目标对象即可 3、synchronized锁与重排序无关
  synchronized锁通过互斥锁,有序的保证线程访问特定的代码块。代码块内部的代码正常按照编译器执行的策略重排序。
  尽管synchronized锁能够回避多线程环境下重排序带来的不利影响,但是互斥锁带来的线程开销相对较大,不推荐使用。
  synchronized 块里的非原子操作依旧可能发生指令重排

OPPOFindX3Pro摄影师版评测重新定义高颜值手机的ampampquot美学与精造ampampquot科技犬最近有很多网友私信科技犬,询问OPPOFindX3Pro摄影师版这款手机的综合表现到底如何?今天科技犬就通过全方位的深度实测来分享一下这款机型的上手体验心得,供各位网友参考。数字化网络化智能化制造业迈上新台阶新华社北京10月4日电题数字化网络化智能化制造业迈上新台阶新华社记者张辛欣一键协同,智慧供应链可实现物料自动调配企业上云,智能调度系统帮助优化排产数字工厂,自动化生产线助力提质增效库克获得50亿奖励,苹果13香却狂出bug!网友感觉像拆盲盒现年60岁的蒂姆库克自从2011年出任苹果首席执行官以来已有十多年,早在今年8月份,他收到了500多万股苹果股票奖励,约为7。5亿美元(约合人民币48。33亿元)。库克再获25。5数字化网络化智能化制造业迈上新台阶新华社北京10月4日电题数字化网络化智能化制造业迈上新台阶新华社记者张辛欣一键协同,智慧供应链可实现物料自动调配企业上云,智能调度系统帮助优化排产数字工厂,自动化生产线助力提质增效贝佐斯所有努力,都应集中在一点上贝佐斯,被称为亚马逊的教父,一手造就了绝对高效的亚马逊文化。他是Kindle和Alexa(即Echo音箱等品牌)的天才发明家,也是一位多面手CEO,缔造了利润滚滚的企业云计算服务平沃尔沃发布长途自动驾驶卡车原型沃尔沃集团汽车自动驾驶部门VolvoAutonomousSolutions与自动驾驶初创公司Aurora的合作达成了一项里程碑式的发展。当地时间9月28日,两家公司发布了基于沃尔沃今日区块链资讯1。美国白宫周五发布了总统拜登关于政府网络安全工作的声明。拜登表示,美国将召集30个国家加快我们在打击网络犯罪改善执法合作阻止非法使用加密货币以及通过外交方式解决这些问题方面的合作实体电商一体化,有哪些表现形式?实体电商一体化,有多种表现形式一自己生产自己做电商优势对市场需求把我十分准确。缺陷是做不到及时服务二生产企业自己做独立电商平台,同时发展区域服务商进行本区域客户服务优势是生产企业对iPhone13与三星GalaxyS22对比三星胜出?苹果新旗舰手机iPhone13提供更大的电池更亮的屏幕和摄像头增强功能,更不用说性能最好的移动处理器了,令众多友商望而生畏。这边根据泄露的消息表明,三星GalaxyS22将带来新的用技术创新让小米Civi天生好看!小米全新的潮流系列小米史上最好看的小米手机今年续航最出色的小米手机潮流系列中最轻最薄的手机一场天生好看的科技发布会小米Civi新品发布会于9月27日举行天生好看更要好用小米Civi从4099跌至2969,5500mAh双涡散热,骁龙888旗舰很有诚意根据2021年第二季度数据显示,中国PC出货量排行榜,联想高居榜首,以560万台出货量,占据了40的市场份额,不得不说在PC行业,联想在国内依然处于领先位置。很多网友说联想不是中国
软萌Q弹的少女系办公鼠标雷柏M650多模无线鼠标对于百元级办公鼠标小伙伴们是否对现售的产品有所了解?如你细搜某宝不难发现这一价格档位可有的选择非常多,可谓百家齐放,叫的上叫不上名的都有,那这类鼠标基本功能基本都差不多,也没必要过新一代起亚KX5即将国产,轴距2755mm,1。5T爆发200PS,颜值太炫酷近日,新一代狮跑已经在海外正式上市了,可能很多年轻人对于这款车并不算了解,毕竟国产狮跑在2013年就正式停产了,取而代之的是起亚KX5,这样的命名方式是为了形成自家KX系列的SUV轴距2786mm,配三层静音玻璃,零百加速8S多,长安新车比H6香多了对于普通消费者而言,大多数人购车时是根据销量排行来选择,哪款车型卖得好就选择哪款。说实话,这种选车方式的确没有错,但要知道在激烈的市场竞争下,越来越多的上市新车在产品力上展现出了碾理想ONE对比奔驰GLC,加一箱油充一次电能跑1080KM,长5米多配6座近些年,支持国货从口号也变成实打实的行动,如今大多数国人买衣服鞋子手机电脑等物品,均会考虑国货,不仅如此,多数国人在选择汽车这样的大件时,也更愿意将国产车型放在考虑范围。而从当下车看了小鹏P7,也看了特斯拉,最后提车理想ONE,这个价格划算吗?今年我手头比较宽裕,准备换辆新车,然后把前几年买的本田雅阁当备用车。考虑到家里有雅阁这辆燃油车了,我就准备去买一辆新能源车,这样上牌方便一点,用车成本也低。在选车的时候,我一开始看为何机油增多乳化出现在本田丰田的车上,但大众却没有问题?眼看冬季就要来临了,相信东北地区不少入手本田以及丰田车型的车主对于机油增多乳化都开始担心起来了,而且在昨天,后台有位粉丝就专门咨询这一问题。他是长春的一位丰田陆放车主,本月中旬加价丰田新车一车难求,9月份仅卖出一辆,不是没人买而是买不到以丰田的品牌号召力来看,旗下车型几乎不存在滞销情况,哪怕是销量表现较差的车型,相比现代福特等品牌也算是高销量车型,但在9月份销量排行榜中,有一款丰田车却垫底轿车领域,以月销仅一辆的中保研最新一批碰撞车型公布,大众撞出最佳成绩,长安表现亮眼经常关注汽车行业的朋友对于中保研绝对不陌生,帕萨特A柱弯曲思域B柱断裂的公布使其迅速出圈,不过被称为最客观碰撞测试机构的中保研,却折在了本田皓影这款车上,前后发布的碰撞测试成绩存在与世无争的凡尔赛,周末来一场说走就走的自驾游,分享用车心得我所向往的生活并不是跻身于闹市之中,反而在快节奏的当下生活中,我更喜欢闹中取静,为了自己的家人在正常工作日会竭尽全力,但闲暇之余应该是属于自己的或者一家人放松的时刻,去一个与世无争上市当天订单达到2万辆,长安欧尚X7PLUS为何如此火爆?大多数家用车的购车预算都在10万左右,那么这个价位下能买一款什么样的SUV呢?是哈弗H6还是吉利博越亦或是价格更高的本田CRV呢?其实细看当下的汽车市场,虽车型众多,但产品同质化现10万多预算,想买一辆省心省油可靠的SUV,选本田缤智错不了10万多预算可选择的SUV车型有很多,因为这个价位内集中了大量的国产车,比如畅销的哈弗H6吉利博越长安CS75等,但国产品牌发展至今在某些方面仍旧存在短板,那就是油耗偏高且质量稳定