这是第二章总结的想法。
Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和 CPU的指令。
volatile的定义与实现原理
定义:volatile修饰的变量在内存中具有可见性,意思就是线程A,线程B等等一系列线程都可以看见它最新的值。Java线程内存
模型确保所有线程看到这个变量的值是一致的。
实现原理:如果对声明了volatile的 变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的最新数据最后写回到系统内存。通过缓存一致性,各个处理器缓存将失效,处理器将从系统内存中把最新的数据读到处理器缓存
里。
原则:1、Lock前缀指令会引起处理器缓存回写到内存。2、一个处理器的缓存回写到内存会导致其他处理器的缓存无效。
synchronized的实现原理与应用
实现原理:JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter 和monitorexit指令实现的,而方法同步是使用另外一种方式实现的(javap看到的是方法修饰符上的ACC_SYNCHRONIZED来完成),这个细节在JVM规范里并没有
详细说明。但是,方法的同步同样可以使用这两个指令来实现。
其本质是对一个对象的监视器(monitor)进行获取,而这个获取过程是排他的,也就是同一时刻只能有一个 线程获取到由synchronized所保护对象的监视。