乱序执行 以及 原子操作
标签(空格分隔): 技术 优化 锁 乱序
[toc]
编译器优化
为了提高执行效率, 在不影响执行结果的情况下, 编译器会任意重排代码顺序, 生成重排之后的汇编代码.
cpu乱序是什么
同样为了提升执行效率, CPU也可能不按照汇编层面的顺序来执行,前提是不影响语义.
譬如
a = 1; b = 2;
以上这段代码,可能并不会按照顺序执行. 如果b 恰好在cpu0的cache里的时候, 就会先执行b = 2
这句话.
还举一个例子,如果某条语句在阻塞的情况下, cpu可能会执行一条上下文无关的代码,以此提高cpu的使用效率.
CPU是怎么做的呢?
CPU有很多cache一致性的协议, 比较有名的是MESI协议.
原子操作
原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行倒结束,中间不会有任何 context switch (切换到另一个线程)。
CPU如何实现原子操作
- 本身自带原子操作 新的cpu保证,在缓存读16/32/64位的操作是原子的
- 总线锁 CPU提供一个LOCK信号, 当一个CPU向总线输出这个信号时,其他CPU向总线的请求会被阻塞
- 缓存锁 只锁住某个缓存(cpu cache)内的数据,不会同时被多个CPU访问
JAVA如何实现原子操作
- CAS 自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止
- 锁
参考资料
- http://www.infoq.com/cn/articles/java-se-16-synchronized
- https://www.zhihu.com/question/36293510
- http://www.infoq.com/cn/author/%E6%96%B9%E8%85%BE%E9%A3%9E