首页 > 其他 > 详细

程序执行乱序

时间:2021-03-30 16:15:41      阅读:24      评论:0      收藏:0      [点我收藏+]

java程序在执行的时候并不一定是按照顺序执行的,多条语句可能是先执行第五条再执行第一条之类的情况,但是他会遵守一个原则是单线程的数据最终一致性,也就是说在单线程情况下是不会有问题的

 

乱序执行有什么好处呢?

  好处就是程序整体的执行效率提高了,假设两个线程的情况,理论上A语句先执行,B语句后执行CPU先执行A语句,但是A语句需要加载一些数据到缓存,而缓存的执行速度大概只有CPU寄存器的1%,如果等待这个过程可能要耗费100ns(基本上是纳秒级,不是毫秒),但是线程B不需要加载数据到缓存,可直接由cpu计算,整个过程只需要1ns,那么如果执着于按照先A后B的顺序,cpu就会等待缓存的加载然后执行,才会到B语句执行,总共耗时101ns,但如果乱序执行的话,在等待A的过程中,先执行B,那么总共的耗时就是100ns。提升了效率。

 

执行顺序也是有原则可寻的,java 有8大happens-before

  

  • 单线程happens-before原则:在同一个线程中,书写在前面的操作happens-before后面的操作。
  • 锁的happens-before原则:同一个锁的unlock操作happens-before此锁的lock操作。
  • volatile的happens-before原则:对一个volatile变量的写操作happens-before对此变量的任意操作(当然也包括写操作了)。
  • happens-before的传递性原则:如果A操作 happens-before B操作,B操作happens-before C操作,那么A操作happens-before C操作。
  • 线程启动的happens-before原则:同一个线程的start方法happens-before此线程的其它方法。
  • 线程中断的happens-before原则:对线程interrupt方法的调用happens-before被中断线程的检测到中断发送的代码。
  • 线程终结的happens-before原则:线程中的所有操作都happens-before线程的终止检测。
  • 对象创建的happens-before原则:一个对象的初始化完成先于他的finalize方法调用。
 

程序执行乱序

原文:https://www.cnblogs.com/karbon/p/14596740.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!