偏向锁是什么

article/2025/10/21 13:06:20

偏向锁操作流程偏向锁,顾名思义,它会偏向于第一个访问锁的线程,如果在接下来的运行过程中,该锁没有被其他的线程访问,则持有偏向锁的线程将永远不需要触发同步

但是从我们跑的代码输出却看不到偏向锁这个东东。为啥对象实例化出来之后,对象头里是不支持偏向的呢?其实是JVM搞的鬼,JVM虽然默认启用偏向锁,但启动后4秒内并不支持。可以通过-XX:BiasedLockingStartupDelay=0参数将JVM启动后支持偏向锁的延迟时间设置为0,这样就可以看到偏向锁的输出了:

 

 

 

  代码也改动一下:

import com.wlf.springcloudgateway.javabean.HelloWorld;
import org.openjdk.jol.info.ClassLayout;import java.util.concurrent.TimeUnit;public class ObjectMarkWord {public static void main(String[] args) throws InterruptedException {//        TimeUnit.SECONDS.sleep(5); // 启用偏向锁,要么开启jvm参数-XX:BiasedLockingStartupDelay=0,要么等待5秒// 实例化对象HelloWorld helloWorld = HelloWorld.builder().name("wlf").build();// 1、普通对象,无锁System.out.println("无锁,可偏向:");printfObjMarkWord(helloWorld);// 2、单线程首次加锁,偏向锁System.out.println("偏向锁:");new Thread(() -> {System.out.println("首次偏向:");synchronized (helloWorld) {printfObjMarkWord(helloWorld);}System.out.println("第二次,重偏向:");synchronized (helloWorld) {printfObjMarkWord(helloWorld);try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}).start();TimeUnit.SECONDS.sleep(1);// 3、多个线程加锁,膨胀为重量锁System.out.println("重量锁:");for (int i = 0; i < 2; i++) {new Thread(() -> {synchronized (helloWorld) {printfObjMarkWord(helloWorld);}}).start();}}private static void printfObjMarkWord(Object obj) {System.out.println("-------------------------");System.out.println(ClassLayout.parseInstance(obj).toPrintable());System.out.println("-------------------------");}}

输出结果

无锁,可偏向:
-------------------------
# WARNING: Unable to attach Serviceability Agent. You can try again with escalated privileges. Two options: a) use -Djol.tryWithSudo=true to try with sudo; b) echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
com.wlf.springcloudgateway.javabean.HelloWorld object internals:OFFSET  SIZE               TYPE DESCRIPTION                               VALUE0     4                    (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4                    (object header)                           88 49 1c 17 (10001000 01001001 00011100 00010111) (387729800)12     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)16     8   java.lang.String HelloWorld.name                           (object)
Instance size: 24 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total-------------------------
偏向锁:
首次偏向:
-------------------------
com.wlf.springcloudgateway.javabean.HelloWorld object internals:OFFSET  SIZE               TYPE DESCRIPTION                               VALUE0     4                    (object header)                           05 00 93 19 (00000101 00000000 10010011 00011001) (429064197)4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4                    (object header)                           88 49 1c 17 (10001000 01001001 00011100 00010111) (387729800)12     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)16     8   java.lang.String HelloWorld.name                           (object)
Instance size: 24 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total-------------------------
第二次,重偏向:
-------------------------
com.wlf.springcloudgateway.javabean.HelloWorld object internals:OFFSET  SIZE               TYPE DESCRIPTION                               VALUE0     4                    (object header)                           05 00 93 19 (00000101 00000000 10010011 00011001) (429064197)4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4                    (object header)                           88 49 1c 17 (10001000 01001001 00011100 00010111) (387729800)12     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)16     8   java.lang.String HelloWorld.name                           (object)
Instance size: 24 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total-------------------------
重量锁:
-------------------------
com.wlf.springcloudgateway.javabean.HelloWorld object internals:OFFSET  SIZE               TYPE DESCRIPTION                               VALUE0     4                    (object header)                           9a 7b c2 02 (10011010 01111011 11000010 00000010) (46300058)4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4                    (object header)                           88 49 1c 17 (10001000 01001001 00011100 00010111) (387729800)12     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)16     8   java.lang.String HelloWorld.name                           (object)
Instance size: 24 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total-------------------------
-------------------------
com.wlf.springcloudgateway.javabean.HelloWorld object internals:OFFSET  SIZE               TYPE DESCRIPTION                               VALUE0     4                    (object header)                           9a 7b c2 02 (10011010 01111011 11000010 00000010) (46300058)4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4                    (object header)                           88 49 1c 17 (10001000 01001001 00011100 00010111) (387729800)12     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)16     8   java.lang.String HelloWorld.name                           (object)
Instance size: 24 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total-------------------------Process finished with exit code 0

我们看到偏向锁在对象实例化后打开了(偏向锁状态为1,锁状态为01),第一次使用锁的时候就是用的偏向锁,持有锁的线程ID被写入对象头中,第二次该线程再次使用偏向锁,线程ID不变。随后我们使用两个其他线程来竞争该锁,偏向锁膨胀为重量锁(锁状态10),原线程ID变更为持有锁的线程指针。

 

文章转自:https://www.cnblogs.com/wuxun1997/archive/2004/01/13/14098987.html


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

相关文章

偏向锁的基本原理

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

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

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

深入探究synchronize锁机制

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

偏向锁的原理与实战

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

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

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

Synchronized-偏向锁

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

面试题-- 什么是偏向锁

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

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

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

条件分布

1.离散型&#xff1a; 例1&#xff1a; 2.连续型&#xff1a;

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

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

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

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

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

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

~《概率论》~条件分布

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

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

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

条件高斯分布

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

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

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

概率论与数理统计(3.3)二维随机变量条件分布

这个条件分布主要只针对二维的 一、离散型随机变量的条件分布 同理固定一个X为一个常数则可得Y的条件分布律 **注&#xff1a;**离散型的求在什么条件下X或Y的条件分布律&#xff0c;知道他们的联合分布律很重要. 1&#xff09; 观察这个公式。 注&#xff1a;必须知道P{X1}的…

多元正态分布条件分布公式总结

假设X是有两个随机向量组成 其中 假设X服从多元高斯分布其中 多元正态分布

【概率论】二维随机变量:联合分布律、边缘分布律和条件分布律之间的关系

摘要&#xff1a;本文主要介绍二维随机变量的联合分布律、边缘分布律和条件分布律之间的关系&#xff0c;并以矿山事故为例&#xff0c;强化对三者关系的认识。 一、联合分布律、边缘分布律和条件分布律之间的关系 1、若已知(X, Y)的联合分布率 > 可以求出X的边缘分布律和…