Java代码在编译后会变成Java字节码, 字节码被ClassLoader
加载到JVM中, JVM执行字节码, 最终要转化为汇编指令在CPU上执行,
Java中所使用的并发机制依赖于JVM的实现和CPU的指令.
volatile原语
volatile
是轻量级的synchronized
, 它在多CPU(注意不仅仅是多核)开发中保证了共享变量的可见性.
由于volatile
只保证了可见性, 无法保证原子性, 所以比synchronized
的执行成本更低, 它不会引起上下文的切换和调度.
volatile实现原理
为加快CPU的处理速度, 它是不直接与内存进行通信, 而是先将系统内存的数据读到CPU内部缓存(L1, L2或其他)后再进行操作,
但操作完全不知道何时会写回内存.
被volatile
标注的变量如果被修改了, 会引起一系列的变化:
- 当前操作的的CPU会强制将缓存行中的变化立即写回到内存中;
- 这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据立即失效, 也就是其他CPU如果需要再使用这个变量,
需要重新到内存中读取到CPU缓存中;
synchronized原语实现原理与应用
Java中的每一个对象都可以作为锁
JavaSE 1.6中, 锁一共有四种状态, 级别从低到高依次为: 无锁状态, 偏向锁, 轻量级锁, 重量级锁. 当低级的锁机制不适配的时候, 程序会自动将锁升级为高级别的锁.
偏向锁
偏向锁使用了一种等到竞争出现才释放锁的机制, 所以