| |
|
|
开发:
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修饰的方法/代码块,根据争抢线程的数量,时机不同,会经历以下的过程
无锁
偏向锁
轻量级锁
重量级锁
大家先了解有这么一个流程,下面来逐个解读 一个对象怎样才算获得了锁既然每个对象都有可能获取到锁资源,那么怎样才能知道是哪个对象获取到了锁呢?
偏向锁偏向锁,顾名思义,它会偏向第一个获取到它的线程,在接下来的执行过程中,如果没有没有其他线程来获取锁资源,那么该线程再次来获得锁资源时则不需要进行同步。 加锁过程当某个锁第一次被一个线程获取时,就会加偏向锁。加锁逻辑是首先将对象头中的标记为设置成01,然后把获取到这个锁的线程id记录到对象头中。这就表示该线程获取了偏向锁。 解锁过程偏向锁的解锁条件很简单,在一个线程获得了偏向锁后,只要有另一个线程来尝试获取锁,并且当前持有偏向锁的线程仍存活,偏向锁就立马解除,锁膨胀为轻量级锁。 轻量级锁加锁过程当一个对象的代码即将进入同步块时,首先会判断该同步对象是否已经锁定,若未锁定,则说明该锁资源空闲。JVM会现在栈中创建一个锁记录,来记录获取到了锁的对象。该锁记录里会存放获取了锁资源的对象的对象投中的部分信息。创建完锁记录之后,JVM将使用CAS操作来更新对象的对象头信息,尝试将锁记录的指针放入对象头中,并修改其标志位。
解锁过程解锁过程同样也是通过CAS来进行的。具体操作是用CAS操作用当前对象头中的信息来替换锁记录中保存的信息,若成功(在锁记录仍指向该对象的对象头信息时才能成功),则释放锁。如果失败了,则说明有其他对象来获取过该锁,在释放锁的同时,还要唤起被挂起的线程。 重量级锁重量级锁不必多说,就是大家通常了解的的Synchronized的加锁,解锁过程。 |
|
|
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2026年1日历 | -2026/1/9 4:15:45- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |