多线程情况下,你的代码执行顺序可能不是顺序执行,结果会不一致
一、思考多线程情况下,程序执行顺序是否是按顺序执行首先定义x = 0; y = 0; a = 0; b = 0; 然后思考a = 1;x = b;两行代码谁先执行问题? 二、实战测试2.1 测试逻辑首先默认为x = 0; y = 0; a = 0; b = 0;然后开启两个线程; 线程1执行:a = 1;x = b; 线程2执行:b = 1;y = a; 有且只有x = b,y = a两个同时先执行,才会出现x=y=0。所以测试是否存在x=y=0观察指令是否会出现重排现象。 2.2 代码测试 public class OrderTest { private static int x = 0, y = 0; private static int a = 0, b = 0; public static void main(String[] args) throws InterruptedException{ for(long i = 0; i < Long.MAX_VALUE; i++){ x = 0; y = 0; a = 0; b = 0; //CountDownLatch是一个同步工具类,它通过一个计数器来实现的,初始值为线程的数量。 // 每当一个线程完成了自己的任务,计数器的值就相应得减1。 // 当计数器到达0时,表示所有的线程都已执行完毕,然后在等待的线程就可以恢复执行任务。 CountDownLatch countDownLatch = new CountDownLatch(2); Thread one = new Thread(new Runnable() { @Override public void run() { a = 1; x = b; // 每调用一次计数器值-1,直到count被减为0,代表所有线程全部执行完毕 countDownLatch.countDown(); } }); Thread two = new Thread(new Runnable() { @Override public void run() { b = 1; y = a; countDownLatch.countDown(); } }); one.start(); two.start(); //等待计数器变为0,即等待所有异步线程执行完毕 countDownLatch.await(); if(x == 0 && y == 0){ //x=y=0 只能是x = b;y = a;这两个先执行 System.out.println("执行次数"+i+"发现x=y=0"); break; } } } } 2.4 测试结果
在1059079(100万)发现了指令重排现象。
三、指令重排现象
概念
指令重排序是指源码顺序和程序顺序不一样,或者说程序顺序和执行的顺序不一致,重排序的对象是指令。
指令重排序是编译器处于性能考虑,在不影响程序(单线程程序)正确性的条件下进行重新排序。指令重排序不是必然发生的,指令重排序会导致线程安全问题。指令重排序也被称为处理器的乱序执行,在这种情况下尽管指令的执行顺序可能没有完全按照程序顺序执行,但是由于指令的执行结果的提交(反应到寄存器和内存中),仍然是按照程序顺序来的,因此处理器的指令重排序并不会对单线程的正确性产生影响。指令重排序不会对单线程程序的正确性产生影响,但他可能导致多线程程序出现非预期结果。 四、如何解决
使用volatile的内存屏障功能。
使用volatile修饰的变量,在读或写之后会形成内存读写屏障的效果。
写屏障会确保指令重排序时,不会将写屏障之前的代码排在写屏障之后。
读屏障会确保指令重排序时,不会将读屏障之后的代码排在读屏障之前。
在1059079(100万)发现了指令重排现象。
我们用volatile修饰一下x,y,a,b变量,修改执行次数,在1059079(100万)后再加000,1059079000(10亿)再次运行观察。即
等了30分钟还没执行结束,也没出现x=y=0,说明volatile成功屏障了指令重排现象。
小帅和小美会毁掉电影吗?注意看,这个男人叫小帅,他怀里的这个女人是小美最近,这个句式在网上屡屡成为电影爱好者吐槽的对象。对那些没接触过3分钟看电影的观众而言,他们很难想象诸如小帅小美这些接地气的名字,既可
海南省农垦中学举行校内选拔赛7名优秀班主任同台竞技第二届全省中小学班主任基本功技能大赛由海南省教育厅主办的第二届全省中小学班主任基本功技能大赛暨展示交流活动正火热进行中,全省各市县学校也在陆续开展初赛复赛的选拔。近日,海南省农垦中学积极备赛,遴选出的7名优秀班主任展
从餐厅服务员到国际枪王,这名95后化州仔超励志近日,出生于茂名化州的95后青年刘付鸿锋的励志人生被新华网央视军事央广军事等点赞,在全网成为热搜,微博相关话题量高达20万。1996年,刘付鸿锋在茂名化州出生。因为家庭原因,他从小
家乡的河文张水章家乡有一条河,河水虽然不大,可一年四季不停地清澈流淌,牵扯着情感乡愁,常常勾引起许许多多的往事,眼前跳动着一个个鲜活的情节。让你哭,让你笑让你喜,让你忧。好像就是一种魔力,它灌注在
知己红颜红颜,是否能知己?不强求,但请珍惜!好朋友问我,孤独,是心里没人寂寞,是心里有人,但不在身边,那你是那一种?我说,我是介于两者之间的。哈哈!这样的选择题,没有触及到我心底。我所说的
QQ空间埋藏了青春,生活磨灭了锋芒刚过30岁,一种无形的压力随之而来,突然发现我的人生陷入了一种混沌之中。面对家庭面对经济负担面对不喜欢的工作面对自我实现的需要,我开始了日复一日的内耗,不自觉地给自己施压,最后差点
冬夜,很长很长,你的梦,可能很美很美关永权组诗十二首关永权原创组诗十二首一忘。曾经走过曾经跟过曾经有过曾经失过曾经恨过曾经爱过曾经想过曾经做过曾经忧过曾经伤过曾经忘过曾经记过曾经来过曾经回过。曾经的曾经很多很多。你可以不忘但请不要放
重温习近平同志摆脱贫困有感摆脱贫困这本书收录了习近平同志担任中共宁德地委书记期间自1988年9月至1990年5月的重要讲话文章,现在读来,其思想和观点依然闪耀着真理的光芒,尤其是习近平同志提倡的滴水穿石精神
中国斯诺克军团连输四场4比5,田鹏飞赵心童皆以5比2取胜德比战北京时间11月21日傍晚至22日早晨,2022世界斯诺克德国大师赛资格赛进行了第一天较量。中国台球军团9人登场,赵心童田鹏飞德比战分别击败吴宜泽和雷佩凡,晋级64强吕昊天张健康袁思
坏消息!中国斯诺克2胜7负惨遭重击7人首轮出局北京时间2022年11月22日,斯诺克德国大师赛资格赛第一天结束。我们的9名选手在第一个比赛日出场,2胜7负。只有赵心通和田鹏飞在德比中获胜,其他7人都被淘汰。这显然是个坏消息。可
三消息!王芳接管中国男篮,赵睿升任广东队长,哈德森或加盟宁波一,王芳接管中国男篮目前中国男篮迎来了比较大的调整,主教练杜锋正式下课,塞尔维亚籍教头乔尔杰维奇接手中国男篮。接下来的比赛任务就是备战世预赛第6个窗口期以及明年的男篮世界杯,更重要