程序执行乱序

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方法调用。
 
posted @ 2021-03-30 14:43  karbon  阅读(368)  评论(0)    收藏  举报