volatile的实现原理
volatile修饰的变量的汇编代码
volatile Person p = new Person(); // 汇编伪指令 lock addl $0x0,(%esp)
lock前缀的指令在多核处理器的作用
【1】将当前处理器高速缓存行内的数据回写到内存中
【2】这个回写内存的操作会将其他CPU里缓存了该内存地址的数据置为失效
synchronized的实现原理
volatile为轻量级的synchronized锁,后者为重量级锁,但是现在也不是那么重了
synchronized实现同步的基础
Java中每一个对象都可以作为锁,表现形式为:
【1】普通同步方法,锁为当前实例对象
【2】静态同步方法,锁为当前Class对象
【3】同步代码块,锁为括号内配置的对象
一个线程进入同步方法或者是同步代码块时必须获得锁,退出同步方法、同步代码块或者是抛出异常时必须释放锁
synchronized实现原理
JVM进入和退出Monitor对象来实现方法同步和代码块同步,任何一个对象都对应一个Monitor对象,同步方法和同步代码块用monitorenter指令和monitorexit指令实现
一个线程执行到monitorenter指令时会尝试获得锁对象对应的Monitor对象的所有权,即获得锁对象对应的锁
方法结束处和异常处有一个monitorexit指令与monitorenter指令相对应,执行到monitorexit指令时会放弃锁对象对应的Monitor对象的所有权,即释放锁对象对应的锁