当前位置: 首页 > news >正文

Java中synchronized的偏向锁是如何减少锁开销的

偏向锁(Biased Locking)是一种优化 Java synchronized 锁的机制,旨在减少在无竞争情况下的锁开销。它通过将锁偏向于单个线程来优化锁的性能。以下是偏向锁减少锁开销的具体方式和原理:

偏向锁的工作原理

  1. 锁的初始状态:

    • 当一个对象的锁首次被持有时,JVM 会将该对象的锁标记为偏向锁,并将对象的头部中的 Mark Word(对象头的一部分)设置为偏向于当前线程。此时,只有这个线程可以获得锁,而其他线程则不能获取。
  2. 偏向锁的记录:

    • 对象头中的 Mark Word: 偏向锁的状态保存在对象头的 Mark Word 中。Mark Word 中会保存持有锁的线程 ID。如果锁的持有者线程进行锁操作,那么在该线程访问该锁对象时,JVM 可以快速检查到该线程已经持有锁,无需进行额外的同步操作。
  3. 锁的获取和释放:

    • 获取锁: 当线程尝试获取锁时,JVM 会检查对象头中的 Mark Word。如果 Mark Word 中记录的线程 ID 与当前线程匹配,则说明当前线程已经持有锁,此时锁的获取是“无成本”的。
    • 释放锁: 当持有锁的线程释放锁时,JVM 会将对象头中的 Mark Word 恢复为初始状态,使得其他线程可以重新获取锁。
  4. 撤销偏向锁:

    • 锁竞争: 如果偏向锁的持有者线程在持有锁期间被中断或其他线程尝试获取该锁,那么偏向锁会被撤销。此时,锁会升级为轻量级锁(Lightweight Locking),并且偏向锁的记录会被移除。

偏向锁减少锁开销的方式

  1. 减少同步操作的开销:

    • 减少标记和检查: 偏向锁在没有竞争的情况下,锁的获取和释放不会进行额外的同步操作。通过直接检查对象头中的 Mark Word,JVM 能够快速判断是否需要进行加锁操作。
  2. 避免锁的重入:

    • 线程 ID 的记录: 偏向锁记录了持有锁的线程 ID,当持有锁的线程再次尝试获取锁时,可以快速确认锁已经被持有,无需进行实际的加锁和解锁操作,从而减少了锁的开销。
  3. 减少线程调度开销:

    • 避免上下文切换: 偏向锁在没有竞争的情况下,避免了线程之间的上下文切换,从而减少了由于线程切换导致的性能开销。

偏向锁的局限性

  1. 锁竞争:

    • 竞争撤销: 如果有多个线程同时竞争一个偏向锁,偏向锁会被撤销并升级为轻量级锁,这会引入额外的开销。此时,锁的优化效果可能会减少。
  2. 长时间持有:

    • 长时间持有偏向锁: 如果线程长时间持有偏向锁而没有竞争,虽然可以减少锁的开销,但在线程进行操作时,偏向锁的持有者需要保持对象头中的线程 ID,这可能会导致一些内存开销。

示例代码

以下示例演示了如何触发偏向锁的机制:

public class BiasedLockExample {private static final Object lock = new Object();public static void main(String[] args) {// 创建多个线程来访问同步方法Runnable task = () -> {synchronized (lock) {System.out.println(Thread.currentThread().getName() + " - Acquired lock");try {Thread.sleep(100); // 模拟工作} catch (InterruptedException e) {e.printStackTrace();}}};// 启动多个线程来测试偏向锁的效果for (int i = 0; i < 5; i++) {new Thread(task, "Thread-" + i).start();}}
}

在这段代码中,synchronized 方法的对象 lock 初始会使用偏向锁。随着线程的竞争,JVM 会将偏向锁升级为轻量级锁或重量级锁(如有必要)。

总结

  • 偏向锁: 主要用于减少在没有锁竞争时的开销。
  • 对象头中的 Mark Word: 用于记录持有锁的线程 ID,从而优化锁的获取和释放。
  • 锁竞争和撤销: 当检测到锁竞争时,偏向锁会被撤销并升级为轻量级锁,优化锁的性能。

偏向锁通过在没有竞争的情况下减少同步开销,从而提高程序的执行效率。

相关文章:

Java中synchronized的偏向锁是如何减少锁开销的

偏向锁&#xff08;Biased Locking&#xff09;是一种优化 Java synchronized 锁的机制&#xff0c;旨在减少在无竞争情况下的锁开销。它通过将锁偏向于单个线程来优化锁的性能。以下是偏向锁减少锁开销的具体方式和原理&#xff1a; 偏向锁的工作原理 锁的初始状态: 当一个对…...

react18 + ts 使用video.js 直播.m3u8格式的视频流

一、安装依赖 我使用的video.js版本是8.17.3&#xff0c;从 Video.js 7.x 开始&#xff0c;HLS 支持被内置到了 Video.js 中所以不需要安装其他依赖 npm i video.js 二、创建VideoPlayer组件 import React, { useEffect, useRef } from react import videojs from video.js …...

使用 onBeforeRouteLeave 组合式函数提升应用的用户体验

title: 使用 onBeforeRouteLeave 组合式函数提升应用的用户体验 date: 2024/8/14 updated: 2024/8/14 author: cmdragon excerpt: 摘要&#xff1a;本文介绍了在Nuxtjs中使用onBeforeRouteLeave组合式函数来提升应用用户体验的方法。onBeforeRouteLeave允许在组件离开当前路…...

uni-app 吸顶方案总结

效果 页面级 uni.pageScrollTo 官方文档&#xff1a;https://uniapp.dcloud.net.cn/api/ui/scroll.html#pagescrollto 原生头部导航 uni.pageScrollTo({selector: #tabs,duration: 300 });(推荐)需要兼容自定义头部导航 <template><view id"demo1" :styl…...

【C#】知识汇总

目录 1 概述1.1 GC&#xff08;Garbage Collection&#xff09;1.1.1 为什么需要GC&#xff1f;1.1.2 GC的工作原理工作原理什么是Root&#xff1f;GC算法&#xff1a;Mark-Compact 标记压缩算法GC优化&#xff1a;Generational 分代算法 1.1.3 GC的触发时间1.1.4 如何减少垃圾…...

1、Unity【基础】3D数学

3D数学 文章目录 3D数学1、数学计算公共类Mathf1、Mathf和Math2、区别3、Mathf中的常用方法&#xff08;一般计算一次&#xff09;4、Mathf中的常用方法&#xff08;一般不停计算&#xff09;练习 A物体跟随B物体移动 2、三角函数1、角度和弧度2、三角函数3、反三角函数练习 物…...

虚拟机ubuntu22的扩容记录

这里lsblk命令能看到&#xff0c; ubuntu逻辑分区只有29G&#xff0c; 但总分区60G&#xff0c;还有接近30G未使用。 rootx:/home/x# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 63.9M 1 loop /snap/core2…...

Docker 常用配置

Docker 常用配置 1. 配置方法 修改下面位置&#xff1a; Linux&#xff1a;vim /etc/docker/daemon.jsonmacOS&#xff1a;菜单栏图标->Settings->Docker Engine 注意&#xff1a;修改完需要重启Docker Linux&#xff1a;systemctl restart dockermacOS&#xff1a;…...

通过示例了解 .NET Core 中的依赖注入

依赖注入 (DI) 是一种用于实现 IoC&#xff08;控制反转&#xff09;的设计模式&#xff0c;可以更好地解耦应用程序内的依赖关系并更轻松地管理它们。.NET Core 内置了对依赖注入的支持&#xff0c;提供了一种有效管理依赖关系的强大方法。 一.什么是依赖注入&#xff1f; 依…...

fetch、FormData上传多张图片

利用fetch方法和FormData对象上传多张图片 formdata()对象可以序列化多张图片 <html><head><meta http-equiv"content-type" content"text/html;charsetUTF-8"/><title>测试fetch和formdata上传多张图片</title></head&…...

C++STL详解(五)——list类的具体实现

一.本次所需实现的三个类及其成员函数接口 链表首先要有结点&#xff0c;因此我们需要实现一个结点类。 链表要有管理结点的结构&#xff0c;因此我们要有list类来管理结点。 链表中还要有迭代器&#xff0c;而迭代器的底层其实是指针。但是我们现有的结点类无法完成迭代器的…...

鸿蒙(API 12 Beta3版)【使用投播组件】案例应用

华为视频接入播控中心和投播能力概述** 华为视频在进入影片详情页播放时&#xff0c;支持在控制中心查看当前播放的视频信息&#xff0c;并进行快进、快退、拖动进度、播放暂停、下一集、调节音量等操作&#xff0c;方便用户通过控制中心来操作当前播放的视频。 当用户希望通…...

【STM32项目】在FreeRtos背景下的实战项目的实现过程(一)

个人主页~ 这篇文章是我亲身经历的&#xff0c;在做完一个项目之后总结的经验&#xff0c;虽然我没有将整个项目给放出来&#xff0c;因为这项目确实也是花了米让导师指导的&#xff0c;但是这个过程对于STM32的实战项目开发都是非常好用的&#xff0c;可以说按照这个过程&…...

C#垃圾处理机制相关笔记

C#编程中的垃圾处理机制主要通过垃圾回收器&#xff08;Garbage Collector&#xff0c;GC&#xff09;实现自动内存管理。C#作为一种托管语言&#xff0c;其垃圾处理机制显著减轻了程序员的内存管理负担&#xff0c;与C语言等非托管语言形成鲜明对比。具体介绍如下&#xff1a;…...

C语言memcmp函数

目录 开头1.什么是memcmp函数?2.memcmp函数的内部程序流程图 3.memcmp函数的实际应用比较整型数组比较短整型二维数组比较结构体变量…… 结尾 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们要学一下关于C语言里的memcmp函数的一些知识。 1.什么是memcmp函数?…...

低代码: 组件库测试之Vue环境下的测试工具以及测试环境搭建

Vue Test Utils Vue Test Utils 1 targets Vue 2. Vue Test Utils 2 targets Vue 3. 特别注意要使用 版本 2.0.0 以上 提供特定的方法,在隔离的话环境下,进行组件的挂载,以及一系列的测试 配置开发环境 手动配置, 是比较麻烦的vue cli 是基于插件架构的, 插件可以: 安装对…...

【Vue3】高颜值后台管理模板推荐

ELP - 权限管理系统 基于Vue 3框架与PrimeVue UI组件库技术精心构建的高颜值后台权限管理系统模板。该模板系统已成功实现基于RBAC&#xff08;Role-Based Access Control&#xff09;模型的权限管理系统和字典数据管理模块&#xff0c;后端则使用了Spring Boot框架&#xff0…...

详细介绍Pytorch中torchvision的相关使用

torchvision 是 PyTorch 的一个官方库&#xff0c;主要用于处理计算机视觉任务。提供了许多常用的数据集、模型架构、图像转换等功能&#xff0c;使得计算机视觉任务的开发变得更加高效和便捷。以下是对 torchvision 主要功能的详细介绍&#xff1a; 1. 数据集&#xff08;Dat…...

AI部署——主流模型推理部署框架

我们以最经典的Yolov5目标检测网络为例解释一下10种主流推理部署框架的大概内容&#xff0c;省略模型训练的过程&#xff0c;只讨论模型转换、环境配置、推理部署等步骤。 Intel的OpenVINO — CPUNvidia的TensorRT — GPU/CPUOpenCV DNN Module — GPU/CPUMicrosoft ONNX Runti…...

PyTorch之loading fbgemm.dll异常的解决办法

前言 PyTorch是一个深度学习框架&#xff0c;当我们在本地调试大模型时&#xff0c;可能会选用并安装它&#xff0c;目前已更新至2.4版本。 一、安装必备 1. window 学习或开发阶段&#xff0c;我们通常在window环境下进行&#xff0c;因此需满足以下条件&#xff1a; Windo…...

RWKV7-1.5B-g1a参数详解:为何默认top_p=0.3更适合中文生成?语言分布实证

RWKV7-1.5B-g1a参数详解&#xff1a;为何默认top_p0.3更适合中文生成&#xff1f;语言分布实证 1. 模型概述 rwkv7-1.5B-g1a是基于RWKV-7架构的多语言文本生成模型&#xff0c;特别适合中文场景下的基础问答、文案续写和简短总结任务。作为1.5B参数量的轻量级模型&#xff0c…...

FModel:虚幻引擎资源解析的技术突破与实践指南

FModel&#xff1a;虚幻引擎资源解析的技术突破与实践指南 【免费下载链接】FModel Unreal Engine Archives Explorer 项目地址: https://gitcode.com/gh_mirrors/fm/FModel 在游戏开发与逆向工程领域&#xff0c;资源解析工具的选择直接影响工作效率与成果质量。当面对…...

轻量级二维码工具性能优化:从加载到部署的全流程实践

轻量级二维码工具性能优化&#xff1a;从加载到部署的全流程实践 【免费下载链接】qrcodejs Cross-browser QRCode generator for javascript 项目地址: https://gitcode.com/gh_mirrors/qr/qrcodejs 二维码生成功能已成为现代Web应用的常见需求&#xff0c;但传统实现方…...

从数据流视角看训练:你的GPU/TPU是如何‘吃’数据的?Epoch、Batch与迭代的硬件协同

从数据流视角看训练&#xff1a;你的GPU/TPU是如何‘吃’数据的&#xff1f;Epoch、Batch与迭代的硬件协同 当你在深夜盯着屏幕上缓慢跳动的训练进度条时&#xff0c;是否好奇过那些被吞进GPU的数据究竟经历了怎样的旅程&#xff1f;本文将带你从硬件执行层的独特视角&#xff…...

告别设备标识混乱!用uniappx插件Ba-IdCode-U一站式获取OAID/AndroidID/IMEI(附隐私合规指南)

跨平台开发者的设备标识管理实战&#xff1a;从混乱到合规的完整解决方案 每次启动新项目时&#xff0c;开发者们是否总在纠结该用哪种设备标识&#xff1f;OAID、AndroidID还是IMEI&#xff1f;国内厂商的兼容性问题怎么解决&#xff1f;隐私合规的红线又在哪里&#xff1f;本…...

OpenClaw+GLM-4.7-Flash成本对比:自建模型比API调用节省30%token消耗

OpenClawGLM-4.7-Flash成本对比&#xff1a;自建模型比API调用节省30%token消耗 1. 为什么需要关注token消耗 上周五凌晨两点&#xff0c;我的OpenClaw突然停止了周报自动化任务。查看日志发现是API额度耗尽——当月累计消耗已超过商用GLM-4.7-Flash的套餐限额。这次意外让我…...

OpenClaw 的 Skill免费开源的

OpenClaw 的 Skill 生态非常丰富&#xff0c;其中绝大部分都是免费开源的。以下为您推荐几类实用的免费插件&#xff0c;您可以根据需求选择安装。&#x1f6e1;️ 一、安全与权限控制 (强烈建议优先安装)skill-vetter / clawsec功能&#xff1a;安装插件前自动扫描代码&#x…...

Docker 部署 Vaultwarden:轻量级自托管密码管理解决方案

1. 为什么选择Vaultwarden作为自托管密码管理方案 在这个数字时代&#xff0c;我们每个人平均要管理超过100个在线账户的密码。传统的密码管理方式——用同一个简单密码注册所有网站&#xff0c;或者把密码写在记事本上——已经远远不能满足安全需求。这就是为什么像Bitwarden这…...

OpenCV实战:用Python+SIFT+八点算法搞定双目视觉匹配(附完整代码)

OpenCV实战&#xff1a;PythonSIFT八点算法实现双目视觉精准匹配 在计算机视觉领域&#xff0c;立体匹配是一个经典而富有挑战性的问题。想象一下&#xff0c;当你用双眼观察世界时&#xff0c;大脑能自动计算出物体的距离——这正是双目视觉系统要模拟的过程。本文将带你用Pyt…...

【Python工业视觉性能跃迁指南】:3大编译优化+5个CUDA加速技巧,让检测速度提升8.7倍

第一章&#xff1a;Python工业视觉性能跃迁的底层逻辑与评估体系Python在工业视觉领域长期面临“高表达性”与“低实时性”的根本矛盾。性能跃迁并非单纯依赖硬件升级或框架切换&#xff0c;而源于对计算图编译、内存布局优化、异构加速调度及IO瓶颈解耦四维协同机制的系统性重…...