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

Java并发编程: Synchronized锁升级

文章目录

  • 一、jdk8 markword实现表
  • 二、使用工具来查看锁升级
  • 三、默认synchronized(o)

一、jdk8 markword实现表

在这里插入图片描述
为什么有自旋锁还需要重量级锁:

  • 自旋消耗CPU资源,如果锁的时间长,或者自旋线程多,CPU会被大量消耗。
  • 重量级锁有等待队列,所有拿不到锁的进入等待队列,不需要消耗CPU资源。

偏向锁是否一定比自旋锁效率高:

  • 不一定,在明确知道会有多线程竞争的情况下,偏向锁肯定会涉及锁撤销,这时候直接使用自旋锁。
  • JVM启动过程,会有多个线程竞争,所以默认情况启动时不打开偏向锁,过一段时间再打开。

new -> 偏向锁 -> 轻量级锁(自旋锁、自适应自旋锁)-> 重量级锁:

  • 偏向锁和轻量级锁都是用户空间完成的。
  • 重量级锁是需要向内核申请的。
    在这里插入图片描述
    synchronized优化的过程和markword息息相关,markword中最低的三位代表锁状态,其中1位是偏向锁位,两位是普通锁位。

二、使用工具来查看锁升级

引入依赖:

<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.9</version>
</dependency>

在这里插入图片描述
由上图分析可知刚new出来的对象处于无锁状态,当使用synchronized关键字后处于轻量级锁状态。为什么锁的状态标志在高位,这个和计算机的大小端有关,可参考:计算机中的大小端

三、默认synchronized(o)

00 -> 轻量级锁,默认情况下偏向锁有个时延,默认是4秒。因为JVM虚拟机自己有一些默认启动的线程,里面有好多sync代码,这些syanc代码启动时就知道肯定会有竞争,如果使用偏向锁,就会造成偏向锁不断的进行锁升级的操作,效率低。

-XX:BiasedLockingStartupDelay=0

在这里插入图片描述
在这里插入图片描述
由上图可知new出来的对象是匿名偏向锁,synchronized加锁后变成了偏向锁。

  • 如果设定上述参数
    new Object() -> 101偏向锁 -> 线程ID为0 -> Anonymous BiasedLock。打开偏向锁,new出来的对象,默认就是一个可偏向匿名对象101。
  • 如果有线程上锁
    上偏向锁:指的就是把markword的线程ID改为自己线程ID的过程,偏向锁不可重偏向,批量偏向,批量撤销(也就是锁没有线程竞争)。
  • 如果有线程竞争
    撤销偏向锁,升级轻量级锁。线程在自己的线程栈生成LockRecord,用CAS操作将markword设置为指向自己这个线程的LR的指针,设置成功者得到锁。
  • 如果竞争加剧
    竞争加剧:有线程超过10次自旋,-XX:PreBlockSpin,或者自选线程数超过CPU核数一半。1.6之后,加入自适应自旋Adapative Self Spinning,JVM自己控制。
    升级重量级锁:-> 向操作系统申请资源,linux mutex,CPU从3级-0级系统调用,线程挂起,进入等待队列,等待操作系统的调度,然后再映射回用户空间。
  • 锁的优缺点对比
    在这里插入图片描述

相关文章:

Java并发编程: Synchronized锁升级

文章目录 一、jdk8 markword实现表二、使用工具来查看锁升级三、默认synchronized(o&#xff09; 一、jdk8 markword实现表 为什么有自旋锁还需要重量级锁&#xff1a; 自旋消耗CPU资源&#xff0c;如果锁的时间长&#xff0c;或者自旋线程多&#xff0c;CPU会被大量消耗。重量…...

Atcoder C - Routing

https://atcoder.jp/contests/arc177/tasks/arc177_c 思路&#xff1a;该问题可以归约为最短路问题&#xff0c;问题中的条件1和条件2是相互独立的&#xff0c;可以分开考虑&#xff0c;从地图中的一个点&#xff0c;沿上下左右四个方向走&#xff0c;所花费的代价为&#xff1…...

升级! 测试萌新Python学习之连通数据库Pymsql增删改及封装(四)

pymysql 数据库概述python对数据库的增删改查pymysql核心操作事务事务操作pymysql工具类封装每日复习ChatGPT的回答 数据库概述 分类 关系型数据库: 安全 如, mysql oracle SQLite…database tables 行列 非关系型数据库: 高效 如, redis mongoDB…数据存储结构多样 键值对…...

【大数据】containered学习笔记

文章目录 1. Containerd安装1.1 YUM方式安装 【后端&网络&大数据&数据库目录贴】 1. Containerd安装 1.1 YUM方式安装 获取YUM源 获取阿里云YUM源 wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 查…...

「TypeScript」TypeScript入门练手题

前言 TypeScript 越来越火&#xff0c;现在很多前端团队都使用它&#xff0c;因此咱们前端码农要想胜任以后的前端工作&#xff0c;就要更加熟悉它。 入门练手题 interface A {x: number;y: number; }type T Partial<A>;const a: T { x: 0, y: 0 }; const b: T { …...

k8s 使用Docker和Containerd对比分析

目录 k8s 使用Docker和Containerd对比分析 互动1&#xff1a;docker build构建的镜像和containerd镜像通用吗&#xff1f; 互动2&#xff1a;k8s1.24之前版本和1.24及1.24之后版本区别&#xff1f; k8s 使用Docker和Containerd对比分析 如果你使用Docker作为K8S容器运行时的…...

MySQL 通过 systemd 启动时 hang 住了……

mysqld&#xff1a;哥&#xff0c;我起不来了…… 作者&#xff1a;贲绍华&#xff0c;爱可生研发中心工程师&#xff0c;负责项目的需求与维护工作。其他身份&#xff1a;柯基铲屎官。 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编…...

pat乙1033-旧键盘打字

1测试点2&#xff1a; 输入的字符串如果为空&#xff0c;要用getline(cin,s)&#xff0c;而不是cin>>s&#xff0c;否则程序做不了 2题目说的如果上键坏了那大写字母打印不了&#xff0c;不是大写转小写打印啦&#xff0c;认真读题 3两个for循环长这样&#xff0c;break…...

Ubuntu安装VScode

Ubuntu安装VScode 前言&#xff1a; 1、Ubuntu安装VScode比较方便 2、我更喜欢source insight 1、获取到linux版本的VScode安装包 VSCode 下载地址是&#xff1a;https://code.visualstudio.com/ 2、得到安装包 3、复制到ubuntu中&#xff0c;使用命令安装 sudo dpkg -i cod…...

c# - - - winform程序四个角添加圆角效果

winform 给窗体四个角添加圆角效果。 在窗体 Load 事件中添加如下代码&#xff1a; // 创建了一个圆角矩形的路径&#xff0c;并将其设置为控件的形状 System.Drawing.Drawing2D.GraphicsPath path new System.Drawing.Drawing2D.GraphicsPath(); int radius 30; path.AddAr…...

Springboot 集成 Consul 实现服务注册中心-05

因为后续很多模块都要用到注册中心&#xff0c;所以此处先实现此模块。 Consul简介 Consul是一个开源的服务发现和配置管理工具&#xff0c;具有跨平台、运行高效等特点。它由HashiCorp公司开发&#xff0c;并使用Go语言编写。Consul主要用于实现分布式系统中的服务发现、健康…...

【软考高项】四十六、项目管理科学计算之运筹学

1、线性规划问题 解题思路&#xff1a; 先把文字转化成图表 最快方式应该是把第一题的4个答案直接代入计算&#xff0c;很快得知X2时利润最大。 A0时&#xff0c;利润5*630 A2时&#xff0c;利润2*25*634 A4时&#xff0c;利润4*23*523 A6时&#xff0c;利润4*2(因为甲的…...

使用 Python 和 OpenCV 进行实时目标检测的详解

使用到的模型文件我已经上传了&#xff0c;但是不知道能否通过审核&#xff0c;无法通过审核的话&#xff0c;就只能 靠大家自己发挥实力了&#xff0c;^_^ 目录 简介 代码介绍 代码拆解讲解 1.首先&#xff0c;让我们导入需要用到的库&#xff1a; 2.然后&#xff0c;设…...

Android build.prop生成过程源码分析

Android的build.prop文件是在Android编译时刻收集的各种property【LCD density/语言/编译时间, etc.】&#xff1b;编译完成之后&#xff0c;文件生成在out/target/product/<board【OK1000】>/system/目录下&#xff1b;在Android运行时刻可以通过property_get()[c/c域] …...

计算机网络教材——谢希仁教材与配套PPT课件和《计算机网络——自顶向下方法》

教材链接: https://pan.baidu.com/s/1MUkgTVNMvhFdkGxAd0U7Ew?pwdn3g4 提取码: n3g4 ppt资源&#xff1a;课程包列表 (51zhy.cn) 计算机网络——自顶向下方法&#xff08;资源在下面的评论区里&#xff09;&#xff1a;计算机网络自顶向下方法第7版中文PDF习题参考 - 哔哩哔…...

mysql 离线安装

package download mysql https://dev.mysql.com/downloads/mysql/ libaio http://mirror.centos.org/centos/7/os/x86_64/Packages/libaio-0.3.109-13.el7.x86_64.rpm 根据自己服务器选择下载对应的安装包及依赖 删除本机自带mysql相关 # 首先排查服务器自身是否有安装对应m…...

【C++】 string类:应用与实践

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…...

巩固学习7

正则表达式 就是用来找到符合模式的字符串&#xff0c;这些模式包括&#xff1a;是什么字符&#xff0c;重复多少次&#xff0c;在什么位置&#xff0c;有哪些额外的约束 找某个字符串 import re text身高:178 体重:168 学号:123456 密码:9527 #在Python中&#xff0c;r前缀用…...

Android 右键 new AIDL 无法选择

提示 (AIDL File)Requires setting the buildFeatures.aidl to true in the build file&#xff09; 解决方式&#xff1a; 在app的build.gradl中 adnroid{} 添加&#xff1a; buildFeatures{aidl true}...

使用Springboot整合Elasticsearch

全文搜索引擎 全文搜索引擎是目前广泛应用的主流搜索引擎&#xff0c;也称为全文检索。它的工作原理是计算机索引程序通过扫描文章中的每一个词&#xff0c;对每一个词建立一个索引&#xff0c;指明该词在文章中出现的次数和位置&#xff0c;当用户查询时&#xff0c;检索程序…...

嵌入式工程师职业发展路径:从功能实现到领域专家的价值跃迁

1. 从迷茫到清晰&#xff1a;一个嵌入式工程师的三年复盘与突围 三年前&#xff0c;我带着对电路板和代码的热情&#xff0c;一头扎进了嵌入式开发的世界。和很多新人一样&#xff0c;当时满脑子都是做出“改变世界”的酷产品&#xff0c;想象着自己设计的设备在千家万户、工厂…...

终极Python SECS/GEM协议实现:5分钟构建半导体设备通信系统

终极Python SECS/GEM协议实现&#xff1a;5分钟构建半导体设备通信系统 【免费下载链接】secsgem Simple Python SECS/GEM implementation 项目地址: https://gitcode.com/gh_mirrors/se/secsgem secsgem是一个专为半导体制造行业设计的Python SECS/GEM协议实现库&#…...

UABEA:跨平台Unity游戏资源编辑神器,解锁游戏模组制作新境界

UABEA&#xff1a;跨平台Unity游戏资源编辑神器&#xff0c;解锁游戏模组制作新境界 【免费下载链接】UABEA c# uabe for newer versions of unity 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA 你是否曾想修改游戏中的角色皮肤、替换背景音乐&#xff0c;或是深…...

异常检测实战:从面试陷阱到产线落地的20个关键问题

1. 项目概述&#xff1a;这不是刷题手册&#xff0c;而是一张通往机器学习工程现场的“通关地图”“Crack ML Interviews with Confidence: Anomaly Detection (20 Q&A)”——这个标题里藏着三个被绝大多数求职者严重低估的关键信号&#xff1a;Crack不是“背答案”&#x…...

超自动化巡检:破解运维人员短缺的利器

在数字化转型加速推进的今天&#xff0c;企业IT基础设施正经历着前所未有的指数级增长——物理服务器、虚拟机、容器集群、云原生环境、边缘节点……运维对象的数量与种类日新月异。然而&#xff0c;与之形成鲜明对比的是&#xff0c;运维团队的规模却难以等比扩充。招不到人、…...

CaldroidListener使用教程:轻松实现Android日期点击事件处理

CaldroidListener使用教程&#xff1a;轻松实现Android日期点击事件处理 【免费下载链接】Caldroid A better calendar for Android 项目地址: https://gitcode.com/gh_mirrors/ca/Caldroid Caldroid是一款功能强大的Android日历组件&#xff0c;而CaldroidListener则是…...

“冠珠·美乐童行”公益行动走进广州市增城区高滩小学,唱响爱、筑就美

在520爱家日十周年之际&#xff0c;冠珠瓷砖积极响应国家美育浸润与乡村教育振兴的政策号召&#xff0c;暖心开启 “冠珠美乐童行”公益行动。首站活动由冠珠瓷砖、广州市越秀山体育中心共同主办&#xff0c;以 “乐动童心美育同行” 为主题&#xff0c;走进广州市增城区高滩小…...

OpsKat v1.3.0 - SSH、数据库集中管理工具

平时操作服务器环境&#xff0c;经常要打开好几个工具来回切换&#xff0c;想着能不能直接跟 AI 说一句话就搞定&#xff0c;于是做了 OpsKat &#xff0c;就算你不使用 AI 功能&#xff0c;常用的资产操作都集成在一起&#xff0c;也不用再在好几个工具之间跳了。举几个实际使…...

调查研究-141 全球机器人产业深度调研报告【03篇】机器人产业六大利润池:从核心零部件到软件平台的商业逻辑

TL;DR 场景&#xff1a;关注机器人产业商业模式、利润分配和投资机会的投资者、从业者、分析人士结论&#xff1a;机器人产业利润集中在核心零部件&#xff08;减速器/伺服/电机&#xff09;、软件AI平台和医疗机器人耗材&#xff1b;本体和集成利润率有限产出&#xff1a;六大…...

Cadence AMS数模混合仿真保姆级教程:从Virtuoso环境搭建到仿真加速全流程

Cadence AMS数模混合仿真实战指南&#xff1a;从环境配置到性能调优 数模混合仿真在现代集成电路设计中扮演着关键角色&#xff0c;它打破了传统数字与模拟设计之间的壁垒&#xff0c;让工程师能够在统一环境中验证复杂SoC的系统级行为。Cadence AMS Designer作为行业标杆工具&…...