1.volatile定义和原理
定义:
如果一个字段被声明为volatile,JMM能确保所有的线程看到这个变量的值是一致的.
实现原理:
当一个变量被volatile修饰时,虚拟机在转换为汇编指令的时候,会加入一个Lock前缀的指令.Lock前缀的指令会引发以下的两件事情.
1. 将当前处理器缓存行的数据写入到系统的内存.
2.这个写回内存的操作会使其他的cpu里缓存了该内存地址的数据无效.
简而言之就是当一个变量被volatile修时,cpu不从缓冲行中获取数据, 而从内存中获取数据.
volatile两条原则
1.Lock前缀指令会引起处理器缓存回写到内存.
2.一个处理器的缓存回写到内存会导致其他处理器的缓存无效.
这样也就保证了volatile的修饰的变量的数据一致性.
2.synchronized实现原理
在多线程并发编程中,synchronized一直是一个元老的角色,很多人都说他是重量级的锁,随着jdk的优化,在有些情况下并不是那么重量级.
JVM是基于进入和退出Monitor对象来实现方法的同步和代码块的同步的,代码块的同步是用monitorenter和monitorexit指令实现的.monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束和异常出,jvm要保证每个monitorenter必须要对应的monitorexit与之对应,任何对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态,线程执行到monitorenter指令时,将会尝试获取对象锁对应的monitor的所有权,即尝试获得对象的锁.