面时莫慌 | 你好,谈谈对Synchronized的了解?(三)

  • 时间:2022-03-15 14:28 作者:The_SHY 来源: 阅读:351
  • 扫一扫,手机访问
摘要:四、锁更新Java 1.6之前,synchronized是标准的重量级锁,多个线程竞争共享资源时,未竞争到资源的线程会一直处于阻塞状态,性能开销很大,同时对于重量级锁,对于加锁和释放锁也有很多的资源消耗。为了减少性能开销,提升效率,人们针对不同的加锁场景,细分了四种锁状态,包括无锁、偏向锁、轻量级锁

四、锁更新

Java 1.6之前,synchronized是标准的重量级锁,多个线程竞争共享资源时,未竞争到资源的线程会一直处于阻塞状态,性能开销很大,同时对于重量级锁,对于加锁和释放锁也有很多的资源消耗。为了减少性能开销,提升效率,人们针对不同的加锁场景,细分了四种锁状态,包括无锁、偏向锁、轻量级锁,重量级锁,锁的状态会根据线程竞争资源的激烈程度从低到高不断更新。

4.1 偏向锁

很多时候,锁总是被同一线程屡次获取,并没有线程竞争锁。对于这样的情况,偏向锁就很适用,那究竟什么时候偏向锁呢?在第三章节,我们列出了在synchronized不同的锁状态下,Markword内存布局有很大的差异。

4.1.1 偏向锁获取

image.png

当一个线程去访问synchronized关键字修饰的代码块或者方法时,会在Markword中存储当前线程的ID,当再有线程想尝试进入同步块时,会先通过CAS比较当前Markword存储的线程ID能否为尝试进入同步块的线程ID,假如相等,不需要再次获取锁了,可直接执行同步代码块;假如不相等,说明当前偏向锁是偏向于其它线程,需要撤销偏向锁,而后将锁更新成轻量级锁。

4.1.2 偏向锁撤销

撤销偏向锁并不是将锁真正的撤销,成为无锁的状态。对于偏向锁的撤销,对原持有的线程和锁本身有两种情况。

  • 假如原持有线程恰好执行完了,退出同步代码块,那么这个时候会把Markword保存的线程ID设置为空。
  • 假如原持有线程仍在同步代码块中执行,这个时候偏向锁会更新为轻量级锁,而后原有线程继续执行。

下面图演示在synchronized修饰的同步代码块下,线程T1和线程T2先后竞争锁资源的流程。

image.png

下一章谈谈轻量级和重量级锁。

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】2FA验证器 验证码如何登录(2024-04-01 20:18)
【系统环境|】怎么做才能建设好外贸网站?(2023-12-20 10:05)
【系统环境|数据库】 潮玩宇宙游戏道具收集方法(2023-12-12 16:13)
【系统环境|】遥遥领先!青否数字人直播系统5.0发布,支持真人接管实时驱动!(2023-10-12 17:31)
【系统环境|服务器应用】克隆自己的数字人形象需要几步?(2023-09-20 17:13)
【系统环境|】Tiktok登录教程(2023-02-13 14:17)
【系统环境|】ZORRO佐罗软件安装教程及一键新机使用方法详细简介(2023-02-10 21:56)
【系统环境|】阿里云 centos 云盘扩容命令(2023-01-10 16:35)
【系统环境|】补单系统搭建补单源码搭建(2022-05-18 11:35)
【系统环境|服务器应用】高端显卡再度登上热搜,竟然是因为“断崖式”的降价(2022-04-12 19:47)
手机二维码手机访问领取大礼包
返回顶部