Java synchronized偏向锁、轻量级锁、重量级锁

article/2025/10/21 13:14:28

简介

        synchronized锁共有偏向锁、轻量级锁、重量级锁三种类型,而这三种类型的加锁方式都是相同的,写代码时不用考虑加哪种锁。使用锁时对象首先会变为偏向锁状态,当有其它线程获取锁时会升级为轻量级锁(没有竞争锁),若有线程竞争锁时,直接升级为重量级锁。

一、偏向锁

        当创建对象时该对象的对象头状态会变成偏向锁状态(即使不加synchronized也是默认偏向锁状态,即Biased状态。thread指向偏向的线程,当有线程再次获取锁时,会判断是否为偏向的线程,如果是就可以直接执行同步代码块的内容。若不是,偏向锁升级为轻量级锁。

                

       优点:加锁和释放锁的过程比较耗时,偏向锁不需要频繁的加锁和释放锁。

       注意:1、当开启偏向锁时(默认开启),创建一个对象,对象的Mark Word为偏向锁状态,偏向锁是默认延迟的,不会在程序启动时立即生效(几秒后才生效)。
        2、当禁用偏向锁时,新创建的对象为普通状态,即使该对象被synchronized修饰,也不会变为偏向锁状态。
        3、如果对象调用hashcode方法,会自动禁用偏向锁,是因为偏向锁的对象头中没办法存储hashcode,而轻量级锁和重量级锁的hashcode都存放在获得锁的线程中的栈帧中,当释放锁时会将hashcode、age等数据恢复给锁对象,对象头状态恢复为普通状态。

二、轻量级锁

        1、概念

                轻量级锁和偏向锁加锁方式一样,当偏向锁被其它线程获取时(未发生竞争),会自动升级为轻量级锁。

        2、轻量级锁的加锁和释放锁的过程:

                每个线程的栈帧都会包含一个锁记录,内部可以存储锁对象的Mark Word,如下图:

                        

                当Thread-0获取锁时,会将锁记录中的Object reference指向锁对象,并尝试用cas修改锁对象中的Mark Word,并将Mark Word的值存放在锁记录中,如果修改成功,如下:        

                    

                这样的话锁对象的最后两位就是 00 表示加了轻量级锁。上述是cas操作成功的情况,什么情况下cas操作会失败呢?

                情况一:其它线程已经持有了该对象的锁,表名此时发生了锁的竞争,轻量级锁会膨胀为重量级锁。   

                情况二:自己执行了synchronized的锁重入,那么再添加一条Lock Record作为重入的记数,如下图:

                

                当退出synchronized代码块(解锁)时,如果有取值为null的锁记录时,表示有重入,这时重置锁记录,表示重入次数减1。当锁记录不为null时,会使用cas将Mark Word值恢复给对象。

        注意:轻量级解锁过程中,cas将Mark Word的值恢复给锁对象时,如果此时锁已经膨胀为重量级锁,恢复会失败,即解锁失败,此时会走解重量级锁的流程,参照下文。

三、重量级锁

        概念:

                当线程竞争锁时会将锁膨胀为重量级锁。

        重量级锁加锁过程:

                假如线程0获得了轻量级锁,未释放锁时线程1尝试获取锁,此时轻量级锁膨胀为重量级锁,如下图:

        

                线程1加锁时发现,该对象的锁已经被别的线程持有,且锁状态为轻量级锁(后两位为00)这时线程1会为锁对象申请Monitor锁,让锁对象的Mark Word指向Monitor的地址,线程1进入Monitor的Entrylist中,进入阻塞状态,如下图:

        

        重量级锁释放锁过程:

                当线程0进入释放锁时,使用cas将Mark Worked的值恢复给锁对象时,失败,会进入重量级锁的解锁过程,即按照Monitor地址,设置Owner为null,并唤醒阻塞队列中的线程。

        注意:在重量级锁中,Object原来的Mark Word值会存放在Monitor中,当解锁时,Monitor会将Mark Word的值恢复给锁对象。

 

        

 

 

 

              

 

                  

 

                                

    

        


http://chatgpt.dhexx.cn/article/SOV4pkER.shtml

相关文章

java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁

之前做过一个测试,详情见这篇文章《多线程 1操作的几种实现方式,及效率对比》,当时对这个测试结果很疑惑,反复执行过多次,发现结果是一样的: 1. 单线程下synchronized效率最高(当时感觉它的效率应该是最差…

偏向锁、轻量级锁、重量级锁的区别和解析

为了换取性能,JVM在内置锁上做了非常多的优化,膨胀式的锁分配策略就是其一。理解偏向锁、轻量级锁、重量级锁的要解决的基本问题,几种锁的分配和膨胀过程,有助于编写并优化基于锁的并发程序。 内置锁的分配和膨胀过程较为复杂&…

偏向锁是什么

偏向锁操作流程偏向锁,顾名思义,它会偏向于第一个访问锁的线程,如果在接下来的运行过程中,该锁没有被其他的线程访问,则持有偏向锁的线程将永远不需要触发同步 但是从我们跑的代码输出却看不到偏向锁这个东东。为啥对…

偏向锁的基本原理

偏向锁的基本原理 前面说过,大部分情况下,锁不仅仅不存在多线程竞争,而是总是由同一个线程多次获得,为了让线程获取锁的代价更低就引入了偏向锁的概念。怎么理解偏向锁呢?当一个线程访问加了同步锁的代码块时&#xff…

偏向锁,轻量级锁,重量级锁的核心原理

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章是关于并发编程中偏向锁,轻量级锁,重量级锁的核心原理知识记录。 本篇文章记录的基础知识,适合在学Java的小白,也适…

深入探究synchronize锁机制

synchronized 有三种方式来加锁,分别是: **1. 修饰实例方法:**作用于当前实例加锁,进入同步代码前要获得当前实例的锁 **2. 静态方法:**作用于当前类加锁,进入同步代码前要获得当前类的锁 **3. 修饰代码块&…

偏向锁的原理与实战

文章目录 1. 偏向锁的核心原理2. 偏向锁代码演示3. 偏向锁的膨胀与撤销 1. 偏向锁的核心原理 如果不存在线程竞争的一个线程获得了锁,那么锁就进入偏向状态,此时Mark Word的结构变为偏向锁结构,锁对象的锁标志位(lock)…

Java并发 | 19.[锁机制] 偏向锁(CAS)

文章目录 1. 偏向锁分析回顾轻量级锁偏向锁的优势 2. 偏向锁(CAS)2.1. 偏向锁流程概述2.2. 锁升级 参考资料 1. 偏向锁分析 回顾轻量级锁 在上文 Java并发 | 18.[锁机制] 轻量级锁(CAS自旋锁)中对轻量级锁进行过解析&#xff0c…

Synchronized-偏向锁

偏向锁是什么? 是jdk1.6引入的一种锁优化方式。让 锁对象 偏心于第一次获取锁的线程,记住它的id,当下一次再有线程获取锁的时候,与记录的ID匹配,直接获取锁就行。是一种load-and-test的过程。 引入目的? …

面试题-- 什么是偏向锁

所谓的偏向,就是偏心,即锁会偏向于当前已经占有锁的线程 。 大部分情况是没有竞争的(某个同步块大多数情况都不会出现多线程同时竞争锁),所以可以通过偏向来提高性能。即在无竞争时,之前获得锁的线程再次获…

Java中的偏向锁,轻量级锁, 重量级锁解析

文章目录 参考文章Java 中的锁一些先修知识synchronized 关键字之锁的升级(偏向锁->轻量级锁->重量级锁)无锁 -> 偏向锁偏向锁的撤销(Revoke)偏向锁的批量再偏向(Bulk Rebias)机制偏向锁 -> 轻…

条件分布

1.离散型: 例1: 2.连续型:

关于多元正态分布的条件分布的证明

之前在机器学习 cs229学习笔记3 (EM alogrithm,Mixture of Gaussians revisited & Factor analysis )中直接给出了多元正态分布的条件概率 正好今天上课讲了多元正态分布的内容,但没有涉及条件概率,所以下来baidu了一下,找到一个不错的pp…

条件分布函数(离散-条件分布律)

一、离散随机变量的条件分布函数 1.0、条件分布函数定义 1.1、例 1.1.1、例1 1.1.2、例2 二、连续型随机变量的条件分布函数 2.1、连续随机变量的条件分布函数 2.2、条件概率密度函数

第三章 多维随机变量及其分布 3.3 条件分布

第三章 多维随机变量及其分布 3.3 条件分布 文章目录 第三章 多维随机变量及其分布 3.3 条件分布离散型随机变量的条件分布连续型随机变量的条件分布 离散型随机变量的条件分布 例: 求: 离散型的直接套条件概率的公式就行了。 连续型随机变量的条件分布…

~《概率论》~条件分布

《概率论》条件分布 文章目录 ~《概率论》~条件分布一、离散型随机向量的条件分布1.1、定义1.2、性质 二、连续型随机向量的条件分布2.1、定义2.2、性质 一、离散型随机向量的条件分布 1.1、定义 1.2、性质 二、连续型随机向量的条件分布 2.1、定义 2.2、性质

MCMC算法--Gibbs采样2:多元高斯分布的边际分布与条件分布推导

因为在下篇博客中会介绍Gibbs采样,代码示例用到的是多元高斯分布,所以对条件分布,边际分布公式必须写出来,所以博主整理了下。 参考文献为:http://fourier.eng.hmc.edu/e161/lectures/gaussianprocess/node7.html 由…

条件高斯分布

多元高斯分布的一个重要性质是如果两个变量集是联合高斯分布,那么其中一个基于另一个变量集上的条件分布仍然是高斯分布。边缘高斯分布也有类似结论。 考虑第一种情形的条件高斯分布。假设 X 是一个满足高斯分布 的 D 维向量,我们把 X 分作两个子集 Xa 和…

【概率论】3-6:条件分布(Conditional Distributions Part I)

原文地址1:https://www.face2ai.com/Math-Probability-3-6-Conditional-Distributions-P1转载请标明出处 Abstract: 首先介绍随机变量的条件分布,随后介绍随机变量条件分布下的乘法法则,贝叶斯公式和全概率公式 Keywords: Discrete Conditio…