在java的多线程编程中,我们经常会使用一些关键字,如volatile,sychronized,atomic原子操作等等。那么在更加底层的JVM中,这些关键字是怎么实现其对应的效果的呢?
volatile
volatile在多线程编程中,是用于保证共享变量的“可见性”,即不同的线程读到该共享变量时,数据都是一致的。即使修改该变量后,其他的线程也能获取到该更新的值。另外,相对于sychronized,使用volatile更加轻量,因为他不会引起上下文切换和线程调度。
那么volatile是如何在底层实现的呢?
秘密武器就是:lock指令。
lock指令,是汇编指令。在有volatile关键字定义的地方,在经过编译后,在其前面会有lock指令。
该指令的执行,会有两个步骤
1. 将当前缓存数据行的数据写回系统内存
2. 该动作会触发缓存一致性协议,即在其他CPU中缓存的这条数据会失效
这样就保证了在更新了数据之后,其他的CPU也会得到最新的数据,因为他们自己的缓存数据已经被失效了。另外在执行写回内存的操作时,lock不会锁住总线,一般锁缓存,开销会小一点。
优化:在JDK 7中的LinkedTransferQuene中,追加到64字节,使得队列头和队列尾在不同的缓存行,这样锁缓存的时候就不会同时锁住头和尾,达到优化的目的。当然只能在64位上有效。同时在共享变量频繁改写的时候用会比较好。

本文深入探讨Java中volatile关键字如何利用lock指令确保多线程环境下的数据一致性。通过介绍volatile的工作原理,揭示不同CPU缓存间如何保持同步,以及JDK7中LinkedTransferQueue的优化策略。
402

被折叠的 条评论
为什么被折叠?



