锁
对象头Mark
Mark Word,对象头的标记,32位
描述对象的hash、锁信息、垃圾回收标记、年龄
偏向锁
大部分情况是没有竞争的,所以可以通过偏向锁提高性能
所谓的偏向,就是偏向,即锁会偏向于当前已经占有锁的线程
如果要对一个线程偏向,则将对象头设置为偏向,并将线程ID写入对象头Mark
当发生竞争时,偏向模式结束
轻量级锁
嵌入在线程栈的锁
普通的锁处理性能不够理想,轻量级锁是一种快速的锁定方法.
给一个对象加锁的过程
-------将对象头的mark指针保存到锁对象中
-------将对象头设置为指向锁的指针(在线程栈中)
如果轻量级锁失败,使用常规锁!在竞争激烈时,轻量级锁不适合
自旋锁
当竞争存在是,如果线程可以很快获得锁,那么就不用挂起线程,让线程做几个空操作(自旋) 适合于同步块很短的情况
三种锁的总结
n不是Java语言层面的锁优化方法
n内置于JVM中的获取锁的优化方法和获取锁的步骤
–偏向锁可用会先尝试偏向锁
–轻量级锁可用会先尝试轻量级锁
–以上都失败,尝试自旋锁
–再失败,尝试普通锁,使用OS互斥量在操作系统层挂起