先来熟悉一些术语
内存屏障:是一组处理器指令,用于实现对内存操作的顺序限制。
缓存行:缓存中可以分配的最小存储单元。
原子操作:不可中断的一个或一系列操作。
缓存行填充:当处理器识别到从内存中读取操作数是可缓存的,处理器读取整个缓存航到适当的缓存(L1,L2,L3的或所有)。
缓存命中:如果进行高速缓存航填充操作的内存位置仍然是下次处理器访问的地址是,处理器从缓存中读取操作数,而不是从内存。
写命中:当处理器将操作数写回到一个内存缓存的区域是,首先检查这个缓存的内存地址是否在缓存行中,如果存在一个有效的缓存行,则处理器将这个操作数写回到缓存,而不是写回到内存。
写缺失:一个有效的缓存行被写入到不存在的内存区域。
volatile的应用
volatile是轻量级的synchronized,它只是用来保证共享变量的可见性,不能保证操纵的原子性。
volatile如何实现内存可见性?
深入的说,通过加入内存屏障和禁止重排序优化实现的。
对volatile变量执行写操作时,会在写操作后加入一条store屏障指令。
对volatile变量执行读操作时,会在读操作前加入一条load屏障指令。
volatile保证共享变量可见性
有volatile修饰的变量进行写操作的时候会多出一行汇编代码,该行代码会有一个lock指令。
volatile的两条实现原则:
①: Lock前缀指令会引起处理器缓存会写到内存(使处理器独占任何共享内存)。
②:一个处理器的缓存回写会导致其他处理器的缓存无效。
synchronized的实现原理和应用
synchronized实现同步的基础:
①:对于普通方法,锁是当前实例对象。
②:对于静态同步方法,锁是class对象。
③:同步方法块,锁是synchronized后面括号里的对象。
JVM规范中的实现原理
JVM基于进入和退出Monitor对象实现方法同步和代码块的同步。
Mark Word标记位
synchronized用到的锁是放在JAVA对象头里面的,其中有个Mark Word来存储对象的hashcode、分代年龄和锁标记位,其中锁标记位会产生变化,对应的不同的标记,我们的锁有3种:轻量级锁、重量级锁、偏向锁。
同步原理
代码块同步是使用monitorenter和monitorexit指令实现,monitorenter指令是在编译后插入同步代码块的开始位置,而monitorexit插入到方法结束处和异常处。JVM要保证每个monitorenter必须有monitorexit对应。
更多潍坊达内怎么样相关资讯,请扫描下方二维码