java源代码被编译成java字节码,字节码被类加载器加载到jvm里,jvm执行字节码,最终需要转化为汇编指令在cpu上执行。
1、volatile定义与实现原理
volatile修饰的共享变量能够保证可见性以及防止指令的重排序,并且能够保证对变量但不操作的原子性。
volatile变量在转化为汇编指令时会在其前面加上lock前缀,lock前缀会做两件事:
a、lock前缀指令会引起处理器缓存会写到内存
b、一个处理器的缓存会写到内存会导致其它处理器缓存的失效
2、处理器原子操作的实现原理
由于多核处理器以及处理器的缓存会导致操作非原子,当前处理器能够保证处理器对同一缓存行的64位操作是原子的。处理器提供总线锁定和缓存锁来保证处理器对内存的复杂操作的原子性。
2.1、总线锁定:处理器使用lock#信号,当处理器在总线上输出此信号时,其它处理器的请求会被锁定,此时的内存就相当于被当前处理器所独享。
2.2、缓存锁:内存区域被处理器缓存在缓存行中,在lock操作期间被锁定,在执行锁操作回写到内存时,处理器lock操作期间不需要对总线进行锁定,只需要直接修改内存地址,并且使用缓存一致性来保证只有一个处理器对内存的操作是有效的(原子性)
2.3、缓存一致性:缓存一致性会阻止多个处理器同时对同一内存区域的数据的修改,其它处理器回写数据时会导致其它处理器缓存的失效
3、java原子操作的实现原理:
java中通过使用锁和循环cas操作来实现操作的原子性
4、CAS同时具有volatile读和volatile写的内存语义(原因是lock前缀的效果),cas操作也是通过处理器的cmpsxhg指令来完成的