Java锁升级、偏向锁、轻量级锁

偏向锁

当锁对象第一次被线程获取时,虚拟机会把对象头的锁状态标志设置为01(即偏向状态),同时,使用CAS操作把获取到这个锁的线程的ID记录在对象头的mark word中。如果这个CAS操作成功,那么,以后持有这个偏向锁的线程在进入这个锁相关的同步块的时候都不需要进行同步,只需要测试对象头的mark word中是否存储着当前线程的ID。若测试成功,则直接进入同步块。若测试失败,则需要测试mark word中锁状态标志位是否为01。若不为01(即表示对象此时处于轻量级/重量级锁状态),则使用CAS操作竞争锁。若为01(即01表示对象此时处于已偏向状态),则尝试使用CAS将对象头的偏向线程ID改为当前线程ID。

此处,着重讨论mark word中锁状态标志位为01的情况:由于偏向锁采用了一种等到竞争出现才会释放锁的机制(即偏向锁不会主动释放),所以当前线程就会知道锁对象此时(可能)处于竞争状态了。(在全局安全点——没有正在执行的字节码)JVM会首先暂停持有偏向锁的线程,然后检查拥有偏向锁的线程是否存活。若没有存活,则将对象头设置为无锁状态并重新偏向。若线程仍然存活,则持有偏向锁的栈会被执行,遍历偏向锁的锁记录、栈中的锁记录以及对象头的mark word(就是检查持有偏向锁的线程是否还需要持有偏向锁)。若检查结果表明该持有偏向锁的线程不需要持有偏向锁了,则将锁对象恢复为无锁状态并重新偏向。否则表明此时锁对象真的处于竞争状态了,那么偏向锁就会被升级成轻量级锁。
注意:当锁对象开启偏向时mark word中有一个比特位将会被置为1,所以偏向状态和未锁定状态除了其他字段的区别外,在这个比特位上也有区别。

轻量级锁

在代码进入同步块的时候,如果此同步对象没有被锁定,即锁标志位为01,那么JVM会先在当前线程的栈帧中创建一个存储锁对象头中Mark Word拷贝的空间(称为锁记录),同时将锁对象头中的Mark Word复制到锁记录中并加上Displaced前缀(Displaced Mark Word)。

然后,JVM使用CAS将锁对象头中的Mark Word更新为指向锁记录的指针。若更新成功,则当前线程便持有了该对象的锁,并且锁对象的标志位变为00(表示此对象处于轻量级锁定状态)。若更新操作失败了,虚拟机会首先检查对象的Mark Word是否指向当前线程的栈帧,如果是则表明当前线程已经拥有了这个对象的锁,可以直接进入同步块继续执行。如果不是,则当前线程进入自旋,(个人见解,不当之处欢迎指正)则会有两种情况会膨胀为重量级锁:

  • 当前线程自旋期间,有第三个线程来获取锁,则膨胀为重量级锁,标志位被当前线程置为10,Mark Word中存储的就是指向重量级锁(互斥量)的指针,当前线程和第三个线程进入阻塞状态;
  • 当前线程自旋超过限定次数,则膨胀为重量级锁,标志位被当前线程置为10,Mark Word中存储的就是指向重量级锁(互斥量)的指针,当前线程进入阻塞状态。

如果当前线程自旋的时候没有发生上面两种情况,那么最终它将获得锁对象的轻量级锁。
轻量级锁的解锁也是通过CAS操作进行的,如果对象的Mark Word仍指向线程的锁记录,那么就用CAS把对象当前的Mark Word和线程中的Displaced Mark Word替换回来。若替换成功,则整个同步过程完成,若替换失败,则表明有其他线程竞争过锁,就要在释放锁的同时唤醒被挂起的线程。

参考文献:

1、《深入理解Java虚拟机》,周志明著;

2、《Java并发编程的艺术》,方腾飞,魏鹏,程晓明著;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值