IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Synchronized锁膨胀机制 -> 正文阅读

[游戏开发]Synchronized锁膨胀机制

前言

最近在读《深入理解JVM》,读到第13章 线程安全与锁优化中的轻量级锁与偏向锁时,总是难以理解,直到读到了这篇 死磕Synchronized底层实现–概论后,才恍然大悟,逐渐理解了书中的内容,特此来记录一下。

锁膨胀流程

被Synchronized修饰的方法/代码块,根据争抢线程的数量,时机不同,会经历以下的过程

无锁
偏向锁
轻量级锁
重量级锁

大家先了解有这么一个流程,下面来逐个解读

一个对象怎样才算获得了锁

既然每个对象都有可能获取到锁资源,那么怎样才能知道是哪个对象获取到了锁呢?
在Java中,是通过修改对象头(对象的组成部分之一,存储了对象的运行时数据,哈希码等信息)中的信息来标记该对象是否取得了锁资源的。

对象头的数据结构

偏向锁

偏向锁,顾名思义,它会偏向第一个获取到它的线程,在接下来的执行过程中,如果没有没有其他线程来获取锁资源,那么该线程再次来获得锁资源时则不需要进行同步。

加锁过程

当某个锁第一次被一个线程获取时,就会加偏向锁。加锁逻辑是首先将对象头中的标记为设置成01,然后把获取到这个锁的线程id记录到对象头中。这就表示该线程获取了偏向锁。

解锁过程

偏向锁的解锁条件很简单,在一个线程获得了偏向锁后,只要有另一个线程来尝试获取锁,并且当前持有偏向锁的线程仍存活,偏向锁就立马解除,锁膨胀为轻量级锁。

轻量级锁

加锁过程

当一个对象的代码即将进入同步块时,首先会判断该同步对象是否已经锁定,若未锁定,则说明该锁资源空闲。JVM会现在栈中创建一个锁记录,来记录获取到了锁的对象。该锁记录里会存放获取了锁资源的对象的对象投中的部分信息。创建完锁记录之后,JVM将使用CAS操作来更新对象的对象头信息,尝试将锁记录的指针放入对象头中,并修改其标志位。

  • 如果这个操作成功,则说明该对象获取到了锁资源并进入轻量级锁状态。
  • 如果失败了则说明至少有一条线程与当前线程竞争获取该锁资源。此时虚拟机检查当前对象头是否有指向栈帧中锁记录的指针。 若有,则说明当前是当前对象得到了锁资源(此处注意线程与对象的关系),直接进入同步块执行即可。否则则说明锁已经被其他对象的线程抢占。此时就需要膨胀为重量级锁

解锁过程

解锁过程同样也是通过CAS来进行的。具体操作是用CAS操作用当前对象头中的信息来替换锁记录中保存的信息,若成功(在锁记录仍指向该对象的对象头信息时才能成功),则释放锁。如果失败了,则说明有其他对象来获取过该锁,在释放锁的同时,还要唤起被挂起的线程。

重量级锁

重量级锁不必多说,就是大家通常了解的的Synchronized的加锁,解锁过程。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:44:41  更:2022-04-01 23:47:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 18:58:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码