偏向锁对应的c/c++代码是BiasedLocking 这个文件然后我们进入这个文件中去
可以看到一个init函数
函数注释中文意思
//如果偏向锁是启用的,调度一个任务来触发一些
//开启偏置锁定的运行秒数
//当前加载的类以及将来加载的类。这是一个
//解决方案启动时间倒退,由于大量
//在虚拟机启动时获取的安全点,以撤销bias。
//理想的情况是,我们可以降低消除个人偏见的成本
//不需要这样的机制。
就是解释延迟偏向的作用的,白话就是因为java应用程序在启动时会创建大量的安全点如果创建这些安全点的时候还有锁会到时性能低所以加入了延迟偏向的机制用来保证启动时的快速,就是为了让java程序更加快速的启动
查看jvm参数的指令
java -XX:+PrintFlagsInitial
默认4000也就是延迟4000毫秒才会开始偏向锁
跟进EnableBiasedLockingTask
VMThread::execute(op);函数最终会执行doit函数
然后会执行这里
然后跟进
f(k);是一个函数指针
是这个东西,这里是偏向锁之后设置了一个锁状态为偏向锁
然后需要看oop也就是klass
在klass文件中可以看到对象头中的锁状态由它决定
然后在创建对象的代码中可以看到_prototype_header赋值的操作
然后来到这里
再来到这
再来到这
在这进行了赋值,这里就是新创建了一个对象,对象头里的值的由来也就是markword的值
给prototype_header赋值为001的地方在klass的构造方法中
跟进 看到no_hash_in_place | no_lock_in_place做了一个或运算结果肯定是等于001的,这里是第一次赋值
二次赋值在ClassFileParser文件中
在parseClassFile函数中
然后进入resolve_super_or_fail函数
来到这里
进入resolve_or_null函数然后进入它里面的resolve_array_class_or_null函数中然后在进入它里面的resolve_instance_class_or_null函数中
进入update_dictionary函数中
在这设置为偏向锁
赋值
biased_lock_pattern的值是5也就是101