1. 偏向锁:偏置锁模式用于使锁偏向给定的锁线程。当这个模式设置在低三位时,锁要么偏向某个特定的线程,要么是“匿名的”偏向,表明它可能是有偏见的。当锁是偏向于一个给定的线程,锁定和解锁可以在不使用原子操作的情况下由该线程执行。当锁的偏差被撤销时,它将恢复到正常状态下面描述的锁定方案。注意:Hotspot不会在JVM启动的最初几秒(目前是4秒)内启用偏向锁定对象。这是因为一些基准测试和NetBeans在启动时存在大量的线程争用,而且撤销成本非常高,可以在ieda设置关闭延迟启动 -XX:BiasedLockingStartupDelay=0 如下图,如果调用了计算hashcode()方法锁将会失去偏向线程特性。
2. 轻量级锁:轻量级锁是在单线程中或者多线程交替或互斥执行中没有锁竞争时候经过锁膨胀过程升级成为轻量级锁。得到cup 不需要调用os函数,调用jvm本身实现的锁函数。轻量级锁尝试在应用层面解决线程同步问题,而不触发操作系统互斥操作,轻量级锁减少多线程进入互斥几率,不能代替互斥,效率比偏向锁慢。
3. 重量级锁:在多线程竞争锁过程锁膨胀升级成为重量级锁,每次获取锁都调用os锁函数包括释放锁也同样调用os函数,性能比轻量级锁慢。如果调用wait()方法则锁立刻变成重量级锁。
一、首先我们需要知道什么是java对象头?
然后到jdk源码的hotpot(jvm)目录知道