关于做网站ppt,网站开发需求表模板,中体建设集团门户登录,WordPress设置两个域名文章目录 一、jdk8 markword实现表二、使用工具来查看锁升级三、默认synchronized(o#xff09; 一、jdk8 markword实现表 为什么有自旋锁还需要重量级锁#xff1a;
自旋消耗CPU资源#xff0c;如果锁的时间长#xff0c;或者自旋线程多#xff0c;CPU会被大量消耗。重量… 文章目录 一、jdk8 markword实现表二、使用工具来查看锁升级三、默认synchronized(o 一、jdk8 markword实现表 为什么有自旋锁还需要重量级锁
自旋消耗CPU资源如果锁的时间长或者自旋线程多CPU会被大量消耗。重量级锁有等待队列所有拿不到锁的进入等待队列不需要消耗CPU资源。
偏向锁是否一定比自旋锁效率高
不一定在明确知道会有多线程竞争的情况下偏向锁肯定会涉及锁撤销这时候直接使用自旋锁。JVM启动过程会有多个线程竞争所以默认情况启动时不打开偏向锁过一段时间再打开。
new - 偏向锁 - 轻量级锁自旋锁、自适应自旋锁- 重量级锁
偏向锁和轻量级锁都是用户空间完成的。重量级锁是需要向内核申请的。 synchronized优化的过程和markword息息相关markword中最低的三位代表锁状态其中1位是偏向锁位两位是普通锁位。
二、使用工具来查看锁升级
引入依赖
dependencygroupIdorg.openjdk.jol/groupIdartifactIdjol-core/artifactIdversion0.9/version
/dependency由上图分析可知刚new出来的对象处于无锁状态当使用synchronized关键字后处于轻量级锁状态。为什么锁的状态标志在高位这个和计算机的大小端有关可参考计算机中的大小端
三、默认synchronized(o
00 - 轻量级锁默认情况下偏向锁有个时延默认是4秒。因为JVM虚拟机自己有一些默认启动的线程里面有好多sync代码这些syanc代码启动时就知道肯定会有竞争如果使用偏向锁就会造成偏向锁不断的进行锁升级的操作效率低。
-XX:BiasedLockingStartupDelay0由上图可知new出来的对象是匿名偏向锁synchronized加锁后变成了偏向锁。
如果设定上述参数 new Object() - 101偏向锁 - 线程ID为0 - Anonymous BiasedLock。打开偏向锁new出来的对象默认就是一个可偏向匿名对象101。如果有线程上锁 上偏向锁指的就是把markword的线程ID改为自己线程ID的过程偏向锁不可重偏向批量偏向批量撤销也就是锁没有线程竞争。如果有线程竞争 撤销偏向锁升级轻量级锁。线程在自己的线程栈生成LockRecord用CAS操作将markword设置为指向自己这个线程的LR的指针设置成功者得到锁。如果竞争加剧 竞争加剧有线程超过10次自旋-XXPreBlockSpin或者自选线程数超过CPU核数一半。1.6之后加入自适应自旋Adapative Self SpinningJVM自己控制。 升级重量级锁- 向操作系统申请资源linux mutexCPU从3级-0级系统调用线程挂起进入等待队列等待操作系统的调度然后再映射回用户空间。锁的优缺点对比