JVM Synchronizer

#JVM synchronizer

SafePoint

避免程序长时间运行而不进入safepoint

markword

markword是java对象数据结构中的一部分。

markword数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32bit和64bit,它的最后2bit是锁状态标志位,用来标记当前对象的状态

image-20180905033426190

CAS的问题

CAS为什么会引入本地延迟?这要从SMP(对称多处理器)架构说起。下图大概表明了SMP的结构:

411087_1311836022idIz

其意思是所有的CPU会共享一条系统总线(BUS),靠此总线连接主存。每个核都有自己的一级缓存,各核相对于BUS对称分布,因此这种结构称为“对称多处理器”。

CAS的全称为Compare-And-Swap,是一条CPU的原子指令。Core1和Core2可能会同时把主存中某个位置的值Load到自己的L1 Cache中,当Core1在自己的L1 Cache中修改这个位置的值时,会通过总线,使Core2中L1 Cache对应的值“失效”,而Core2一旦发现自己L1 Cache中的值失效(称为Cache命中缺失)则会通过总线从内存中加载该地址最新的值,大家通过总线的来回通信称为“Cache一致性流量”,因为总线被设计为固定的“通信能力”,如果Cache一致性流量过大,总线将成为瓶颈。

全局安全点

偏向锁(Biased Locking)

偏向锁就是为了消除CAS,消除无竞争情况下的同步原语,即轻量锁的CAS。

它会偏向于第一个访问锁的线程,如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,减少加锁/解锁的一些CAS操作(比如等待队列的一些CAS操作),这种情况下,就会给线程加一个偏向锁。 如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会消除它身上的偏向锁,将锁恢复到标准的轻量级锁。

就是说如果同一时间只有一个线程来获取锁的话,是满足偏向锁的条件的

问题1 :偏向锁什么时候升级为轻量锁,怎么升级