Java并发机制的底层实现原理(volatile)

    技术2025-09-04  25

    Java代码代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的的并发机制依赖于JVM的实现和CPU的指令

    volatile的应用

    volatile是轻量级的synchronize,它保证了多线程开发中保证了共享变量的可见性。 可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。

    如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。

    以下是与实现原理相关的CPU术语: 内存屏障:是一组处理器命令,用于实现对内存操作的顺序限制 缓冲行:CPU高速缓存中可以分配的最小存储单位。处理器填写缓存行时回家再整个缓存行,现代CPU需要执行几百次CPU指令 原子操作:不可中断的一个或一系列操作 缓存行填充:当处理器识别到从内存中读取操作数是可缓存的,处理器读取整个高速缓存行到适当的缓存(L1,L2,L3的或所有) 缓存命中:如果进行高速缓存行填充操作的内存位置仍然是下次处理器访问的地址时,处理器从缓存中读取操作数,而不是从内存中读取 写命中:当处理器将操作数写回到一个内存缓存的区域时,它受限会检查这个缓存的内存地址是否在缓存行中,如果存在一个有效的缓存行,则处理器将这个操作数写回到缓存,而不是写回到内存 写缺失:一个有效的缓存行被写入到不存在的内存区域

    有volatile修饰的共享变量进行写操作的时候会汇编多一行汇编代码,LOCK前缀的指令在多核处理器下会引发两件事情。 1)将当前处理器缓存行的数据写回到系统内存。 2)这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效

    在多处理器下为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是否过期,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存读取数据到处理器缓存里。(总线嗅探机制)

    Processed: 0.012, SQL: 9