轻量级锁与重量级锁

article/2025/7/22 19:18:45

目录

一、轻量级锁

1、使用场景

 2.使用过程

 2.1每次指向到synchronized代码块时,都会创建锁记录(Lock Record)对象,每个线程都会包括一个锁记录的结构,锁记录内部可以储存对象的Mark Word和对象引用reference

 2.2让锁记录中的Object reference指向对象,并且尝试用cas(compare and sweep)替换Object对象的Mark Word ,将Mark Word 的值存入锁记录中

 2.3如果cas替换成功,那么对象的对象头储存的就是锁记录的地址和状态01,如下所示

 2.4如果cas失败,有两种情况

 2.5当线程退出synchronized代码块的时候,如果获取的是取值为 null 的锁记录 ,表示有重入,这时重置锁记录,表示重入计数减1

 2.6当线程退出synchronized代码块的时候,如果获取的锁记录取值不为 null,那么使用cas将Mark Word的值恢复给对象

二、锁膨胀(重量级锁)

1.定义

2.转化过程  

2.1当 Thread-1 进行轻量级加锁时,Thread-0 已经对该对象加了轻量级锁  

 2.2这时 Thread-1 加轻量级锁失败,进入锁膨胀流程

三、自旋优化(重量级锁的优化)

1.定义

 2自旋重试成功的情况

 3自旋重试失败的情况


一、轻量级锁

1、使用场景

轻量级锁的使用场景是:如果一个对象虽然有多个线程要对它进行加锁,但是加锁的时间是错开的(也就是没有人可以竞争的),那么可以使用轻量级锁来进行优化。轻量级锁对使用2者是透明的,即语法仍然是synchronized,假设有两个方法同步块,利用同一个对象加锁

static final Object obj = new Object();
public static void method1() {synchronized( obj ) {// 同步块 Amethod2();}
}
public static void method2() {synchronized( obj ) {// 同步块 B}
}

 2.使用过程

 2.1每次指向到synchronized代码块时,都会创建锁记录(Lock Record)对象,每个线程都会包括一个锁记录的结构,锁记录内部可以储存对象的Mark Word和对象引用reference

lock record地址中 00轻量级锁 10重量级锁 11GC 再与Object的对象头的Hashcode交换  

 2.2让锁记录中的Object reference指向对象,并且尝试用cas(compare and sweep)替换Object对象的Mark Word ,将Mark Word 的值存入锁记录中

 2.3如果cas替换成功,那么对象的对象头储存的就是锁记录的地址和状态01,如下所示

 2.4如果cas失败,有两种情况

  1. 如果是其它线程已经持有了该Object的轻量级锁,那么表示有竞争,将进入锁膨胀阶段

  2. 如果是自己的线程已经执行了synchronized进行加锁,那么那么再添加一条 Lock Record 作为重入的计数

 如下图为情况2,在添加一条

 2.5当线程退出synchronized代码块的时候,如果获取的是取值为 null 的锁记录 ,表示有重入,这时重置锁记录,表示重入计数减1

 2.6当线程退出synchronized代码块的时候,如果获取的锁记录取值不为 null,那么使用cas将Mark Word的值恢复给对象

  1. 成功则解锁成功

  2. 失败,则说明轻量级锁进行了锁膨胀或已经升级为重量级锁,进入重量级锁解锁流程

二、锁膨胀(重量级锁)

1.定义

如果在尝试加轻量级锁的过程中,cas操作无法成功,这是有一种情况就是其它线程已经为这个对象加上了轻量级锁,这是就要进行锁膨胀,将轻量级锁变成重量级锁。

2.转化过程  

2.1当 Thread-1 进行轻量级加锁时,Thread-0 已经对该对象加了轻量级锁  

 2.2这时 Thread-1 加轻量级锁失败,进入锁膨胀流程

 2.2.1即为对象申请Monitor锁,让Object指向重量级锁地址,然后自己进入Monitor 的EntryList 变成BLOCKED状态

2.2.2如图所示

 2.2.3当Thread-0 推出synchronized同步块时,使用cas将Mark Word的值恢复给对象头,失败,那么会进入重量级锁的解锁过程,即按照Monitor的地址找到Monitor对象,将Owner设置为null,唤醒EntryList 中的Thread-1线程

三、自旋优化(重量级锁的优化)

1.定义

重量级锁竞争的时候,还可以使用自旋来进行优化,如果当前线程自旋成功(即在自旋的时候持锁的线程释放了锁),那么当前线程就可以不用进行上下文切换就获得了锁

 2自旋重试成功的情况

 3自旋重试失败的情况

自旋了一定次数还是没有等到持锁的线程释放锁

 自旋会占用 CPU 时间,单核 CPU 自旋就是浪费,多核 CPU 自旋才能发挥优势。在 Java 6 之后自旋锁是自适应的,比如对象刚刚的一次自旋操作成功过,那么认为这次自旋成功的可能性会高,就多自旋几次;反之,就少自旋甚至不自旋,总之,比较智能。Java 7 之后不能控制是否开启自旋功能


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

相关文章

轻量级卷积神经网络

目录 SqueezeNet(2016.11) SqueezeNet(2016.11) 作者认为模型的参数量是影响模型大小以及训练速度的主要因素,因此本篇文章的设计思想就在于如何减少模型的参数量。本篇文章共有6节,其中第1、2节为介绍及相关工作部分;第3节描述了SqueezeNet…

轻量级linux桌面环境,Linux发行版最为轻量级的桌面环境之一Xfce 桌面

开源多样性应该是 Linux 最好的特性之一,用户可以不断尝试各种自己喜欢的新鲜玩法与花样,并从中选择最适合自己的应用。无论你是 Linux 新人还是老鸟,层出不穷的应用和桌面环境可能都会让我们应接不暇,特别是尝试不同的 Linux 桌面环境,可以说是一件非常有趣但也耗时的事情…

鸿蒙轻量级数据存储Preferences

1,概述 鸿蒙轻量级偏好数据库-Preferences。 轻量级偏好数据库主要提供轻量级Key-Value键值对形式操作,支持少量数据,数据存在在本地文件中,同时也加载在内存中,所以速度快,效率高,属于非关系型…

轻量级目标检测算法整理

随着目标检测算法的快速发展,以及终端应用的日渐广泛,工业界对深度学习网络在终端应用的关注度越来越高,尤其是对于如何保持速度和精度上的平衡,也形成了不小的研究热度。本篇整理了一些较新的轻量级目标检测网络,结合…

轻量级网络总结

文章目录 1. SqueezeNet2. ShuffleNet2.1 v12.2 v2 3. MobileNet3.1 v13.2 v23.3 v3 4. GhostNet4.1 v14.2 v2 1. SqueezeNet SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and< 0.5 MB model size 考虑到卷积层的参数量为 C i n ∗ C o u t ∗ K ∗ K …

轻量级c语言开发环境,几款轻量级的C/C++编写软件

因为有同学问我写C用什么软件好点。。。其实这些软件各有优势&#xff0c;只不过看自己需要罢了。 我下了个VS 2017.....不过太大了点。算下来20G左右&#xff0c;硬盘小点的笔记本直接没法玩......(我的就没问题&#xff0c;嘻嘻嘻)&#xff0c;要是你想用VS2017&#xff0c;我…

Synchronized原理(轻量级锁篇)

Synchronized原理&#xff08;轻量级锁篇&#xff09; 简述 介绍 轻量级锁是JDK1.6之中加入的新型锁机制&#xff0c;它名字中的“轻量级”是相对于使用操作系统互斥量来实现的传统锁而言的&#xff0c;因此传统的锁机制就称为“重量级”锁。首先需要强调一点的是&#xff0…

轻量级 android模拟器,【分享中控】轻量级中控系统

先上图: 这是一个简单的模拟器本地中控,自恋的说非常好用,它帮助了我成功开发无数款脚本,已经在多台电脑上稳定运行数月。 虽然不算强大,但是足以应付大部分的脚本开发需求。 [hide]注意 1. 使用此软件的前提是安装好 .Net Framework 4.5 运行环境,Win10自带此环境无需安…

浅析轻量级锁

从轻量级锁 来看锁机制。 (目前 上的唯一一张图。= =。 因为有些东西没有图的话 是很难理清楚的 - - )对象是否被某个线程的锁定的依据是, 对象头中记录的信息。 mark word 也叫对象标志词。对象头的信息内容是变化的,变化后是根据不同的锁标志位来描述对应的信息。 比如当…

14种轻量级网络综述 — 主干网络篇

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 作者丨VincentLee 来源丨晓飞的算法工程笔记 编辑丨极市平台 导读 早期的卷积神经很少考虑参数量和计算量的问题&#xff0c;由此轻量级网络诞生&#xff0c;其旨在保持模型精度基础上近一步减少模型参数量和…

神经网络学习小记录47——ShuffleNetV2模型的复现详解

神经网络学习小记录47——ShuffleNetV2模型的复现详解 学习前言什么是ShuffleNetV2ShuffleNetV21、所用模块2、网络整体结构 网络实现代码 学习前言 据说ShuffleNetV2比Mobilenet还要厉害&#xff0c;我决定好好学一下。 什么是ShuffleNetV2 这篇是ECCV2018关于轻量级模型的…

一个简单的dos命令实现无限弹窗,卡死电脑

教大家一个简单的dos命令实现无限弹窗&#xff0c;从而实现卡死电脑。 1.新建一个文本文件 2.在该文件里面输入 : start start cmd goto start 3.保存后并把此文件的.txt后缀改为.bat 提示&#xff1a;如果你的计算机不显示后缀拓展名&#xff0c;首先应先让显示拓展名再进行操…

Pycharm制作搞怪弹窗(声音强制最大,屏幕亮度强制最亮,按钮躲避,弹窗炸弹)

Pycharm制作搞怪弹窗(声音强制最大&#xff0c;屏幕亮度强制最亮&#xff0c;按钮躲避&#xff0c;弹窗炸弹&#xff09; 闲来无聊用python制作了一个搞怪的桌面弹窗程序&#xff0c;惊喜连连哦 运行动图 实现代码&#xff1a; import tkinter as tk import tkinter.font as…

Charles抓包出现弹窗问题或者无法抓包https问题汇总

一、重要问题总结 1、https抓包需要在电脑端和移动端都装上相应的证书&#xff01;不同的电脑、手机需要的证书可能不一样&#xff0c;如果不能正常工作&#xff0c;建议重新安装。 2、iOS10及以上系统&#xff0c;需要在安装charles证书后 在设置->通用->关于本机->…

python制作恶搞_Pycharm制作搞怪弹窗的实现代码

闲来无聊用python制作了一个搞怪的桌面弹窗程序,惊喜连连哦 运行动图 实现代码: import tkinter as tk import tkinter.font as tkFont # 引入字体模块 import time import sys import pygame import random import threading import win32api import wmi from tkinter.messa…

用Python写一个假的病毒炸弹(整蛊)

病毒炸弹 现在我们用Python来写一个假的病毒炸弹 弹窗实现 import tkinter as tk import random import threading import timedef boom():window tk.Tk()width window.winfo_screenwidth()height window.winfo_screenheight()a random.randrange(0, width)b random.ra…

bat 炸弹升级

转自&#xff1a;http://digi.163.com/15/0320/06/AL4LP0QD0016192R.html 第1页&#xff1a;什么是批处理炸弹&#xff1f; 最近网上流传一个叫做《大哥别杀我》视频纷纷遭到网友模仿&#xff0c;虽然我们都知道视频里出现的人大多都是群众演员&#xff0c;但还是会被视频中各种…

xss完成浏览器视窗炸弹

无聊&#xff0c;&#xff0c;&#xff0c;发个文章。 这个就是很简单的视窗炸弹&#xff0c;放在自己的 xss平台上&#xff0c;执行就会一直打开页面。初学者可以 试一试。 function WindowBomb() { var iCounter 0 // dummy counter while (true) { window.open(“https:/…

Linux fork炸弹以及预防办法

fork炸弹是什么&#xff1f; fork炸弹以极快的速度创建大量进程&#xff08;进程数呈以2为底数的指数增长趋势&#xff09;&#xff0c;并以此消耗系统分配予进程的可用空间使进程表饱和&#xff0c;而系统在进程表饱和后就无法运行新程序&#xff0c;除非进程表中的某一进程终…

弹窗炸弹恶搞整人

1.创建一个记事本文件 2.编辑文件内容 在文件中输入以下内容并保存 :start start cmd goto start3.实现弹窗炸弹 把文件扩展名改为.bat。 双击执行&#xff08;慎用&#xff09;&#xff0c;效果如下&#xff1a; 4.解除无线弹窗的方法 方法一&#xff1a; 新建个记事本…