【JUC】二十七、synchronized锁升级之无锁

文章目录

  • 1、背景
  • 2、Monitor、Java对象、线程如何关联起来的?
  • 3、synchronized锁升级
  • 4、锁升级之无锁

关于synchronized同步,能用无锁结构就不要用锁;能锁块,就不要锁整个方法;能用对象锁,就不要用类锁。

在这里插入图片描述
用锁能够保证数据的安全性,但性能下降。无锁,性能提升,但安全性下降,如何平衡?

1、背景

在Java早期版本,synchronized是重量级锁,效率低下,因为监视器锁monitor依赖底层操作系统的Mutex Lock(系统互斥量)来实现。

Java5之前,用户态和内核态之间的切换:
在这里插入图片描述

用户态和内核态之间切换指的是:

Java的线程是映射到操作系统的原生线程之上的(Java的start方法底层是native start0方法),因此阻塞和唤醒一个线程都需要操作系统介入去切换CPU的状态来完成(内核态),这种状态切换需要耗费处理器的时间,如果同步代码块很简单,那切换的时间可能比代码执行时间还长。

而用户态和内核态有各自专用的内存空间、专用的寄存器 ⇒ 因此,用户态切换到内核态还需要传递很多变量和参数过去,且内核也要去维护这些值。

鉴于以上,Java6后,引入轻量级锁和偏向锁,别一下就捅到重量级锁。一句话,为了尽量减少用户态和内核态的切换次数。

2、Monitor、Java对象、线程如何关联起来的?

如果一个Java对象被某线程锁住,则:

  • 该Java对象的Mark Word中的Lock word指向monitor的起始地址
  • Monitor的__Owner字段会存放拥有这个对象锁的线程的 id

在这里插入图片描述
在这里插入图片描述

关于Monitor的复习:【Monitor】

Monitor是在JVM底层实现的,底层代码是c++。本质是依赖于底层操作系统的Mutex Lock实现,而Mutex Lock 的切换需要从用户态转换到内核态中,因此状态转换需要耗费很多的处理器时间,所以synchronized在Java中是一个重量级操作。

3、synchronized锁升级

synchronized锁升级主要依赖Mark Word中锁标志位和释放偏向锁标志位。

在这里插入图片描述

  • 偏向锁:MarkWord存储的是偏向的线程ID

  • 轻量锁:MarkWord存储的是指向线程栈中Lock Record的指针

  • 重量锁:MarkWord存储的是指向堆中的monitor对象的指针

4、锁升级之无锁

无锁:即初始状态,一个对象被实例化后,如果还没有被任何线程竞争锁,那它就是无锁状态(001)

在这里插入图片描述
用JOL展示下,一个对象在无锁状态下,其对象头是如何记录的。

Object object = new Object();
//hashcode方法是native的,调用了才会生成,否则为0
System.out.println("10进制:" + object.hashCode());
System.out.println("16进制:" + Integer.toHexString(object.hashCode()));
System.out.println("2进制:" + Integer.toBinaryString(object.hashCode()));
System.out.println(ClassLayout.parseInstance(object).toPrintable());

结果分析:前25位是没使用的unUsed,再往后31位是hashcode,倒着看

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Py/Java/C++三种语言OD2023C卷真题】20天拿下华为OD笔试【单调栈】2023C-找最小数【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录 题目描述与示例题目描述输入输出示例一输入输出说明 示例二输入输出 示例三输入输出 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 给一个正整数 NUM1,计算出新正整数 NUM2。NUM2 为 NUM1 中移…

LDO和DCDC的区别

目录标题 前言什么是LDO?什么是DCDC?LDO和DCDC的主要区别 前言 对于初学者来说,最常见到的LDO就是最小系统板上自带的低压差线性稳压器,其用于将USB输入的5V电压转化为3.3V供给单片机。最长用到DCDC器件,就是在做小车…

python算法例18 滑动窗口的最大值

1. 问题描述 给定一个可能包含重复整数的数组和一个大小为k的滑动窗口,从左到右在数组中滑动这个窗口,找到数组中每个窗口内的最大值。 2. 问题示例 给出数组[1,2,7,7,8],滑动窗口大小为k3&a…

Redis - 主从集群下的主从复制原理

主从复制过程 数据同步演变过程 sync 同步 Redis 2.8 版本之前,首次通信成功后, slave 会向 master 发送 sync 数据同步请求。然后 master 就会将其所有数据全部发送给 slave ,由 slave 保存到其本地的持久化文件中。这个过 程…

推荐10款值得信赖的办公软件app,为你的工作提效!

在如今的工作环境中,人们需要经常使用各种办公软件来提高工作效率,同时也帮助我们更好地管理自己的工作和生活。以下是推荐10款值得信赖的办公软件app: 1、Evernote – Evernote是一款非常流行的笔记应用程序,适用于多个平台。它…

conda的安装及使用 以pycharm 为例

下载 https://docs.conda.io/en/latest/miniconda.html 下载 window版本 74M且下着吧。 安装 一路next或agree ,不同意人家也不会按装 。重要的是安装目录 让andconda当老大 pycharm的使用 创建项目时如下图选择 成功后进入项目的Terminal则如下图表示成功

快速二维相位解包算法基于按照非连续路径进行可靠性排序

Miguel Arevallilo Herra ez, David R. Burton, Michael J. Lalor, and Munther A. Gdeisat 摘要: 据我们所知,我们描述了一种新的相位展开技术。已经提出了几种基于首先展开最可靠像素的算法。这些仅限于连续路径,并且在定义起始像素时会遇…

目前进度记录

目前已经把之前记录的方法都实现了,目前的主函数可以写的更简单比如 int main(int argc, char* argv[]) {KernelClass::create_kernel();MPI_Init(&argc, &argv);kernel().mpi_manager.init_mpi(argc, argv);//创建种群int group1 kernel().conn_manger.c…

山西教资面试---结构化真题125道

文章目录 第一章 教育教学类单元1:应急应变(1-21)单元2:日常管理(22-54)单元3:人际关系(55-66) 第二章 综合分析类单元4:社会现象(66-112&#xf…

Python特征工程神器:Feature Engine库详解与实战

更多资料获取 📚 个人网站:ipengtao.com 特征工程是机器学习中至关重要的一环,而Feature Engine库作为Python中的强大特征工程工具,提供了丰富的功能和灵活的操作。本文将深入探讨Feature Engine的各种特性,包括缺失值…

torch.bmm

在PyTorch中,torch.bmm函数用于执行批量矩阵相乘(Batch Matrix Multiplication)。它接受三维张量作为输入,并执行批量矩阵相乘的操作。 具体来说,假设我们有两个输入张量A和B,它们的维度分别为 &#xff…

单片机的低功耗模式介绍

文章目录 简介一、功耗来源说明1.1、芯片工作模式1.2、静态损耗1.3、I/O额外损耗1.4、动态损耗 二、功耗如何测量三、降低功耗有什么方法3.1、选取合适的芯片工作模式3.2、降低工作频率3.3、关闭不需要使用的外设3.4、 降低静态电流损耗3.5、 周期采集供电3.6、 设置IO口状态 四…

HNU数据库大作业-世界杯比赛系统

前言 之前做的那个版本bug较多,后进行了大量优化。 此项目是一个前后端分离的项目,前端主要使用htmlcssjs搭建,使用的是layui框架 后端使用php语言,仅实现了简单的查询数据库功能,无法实现多并发查询等复杂情况 数…

云架构俭约之道七法则(The Frugal Architect)

文章目录 一、前言关于 Law 与 Rule 的区别 二、云架构俭约之道七法则Design(设计方面)Law 1:把成本作为非功能性需求Law 2:可持续性系统需要将成本与业务相匹配Law 3:架构设计是一系列权衡的取舍 Measure(…

iOS加密CoreML模型

生成模型加密密钥 必须在Xcode的Preferences的Accounts页面登录Apple ID,才能在Xcode中生成模型加密密钥。 在Xcode中打开模型,单击Utilities选项卡,然后单击“Create Encryption Key”按钮。 从下拉菜单中选择当前App的Personal Team&…

多项目同时进行如何做好进度管理?

许多企业都面临着同时进行多个项目的情况,因此项目经理经常需要管理多个项目。多项目管理的难点不仅在于项目数量增加,还在于资源分配不均、难以监控多个项目进度以及复杂的沟通协作。 一、从项目经理的角度分析 首先,要把握高效项目管理的几…

蚂蚁SEO实用的网络baidu蜘蛛有哪些

网络蜘蛛是一种用于从互联网上自动抓取信息的程序。它们根据给定的规则和指令,遍历网站上的页面,收集信息并将其存储在数据库中。网络蜘蛛在搜索引擎、数据挖掘、信息提取等领域有着广泛的应用。本文将介绍一种实用的网络蜘蛛,并探讨其实现原…

视频号小店与小商店有什么区别?一篇文章带你了解!

我是电商珠珠 视频号小店和小商店都是腾讯开发出来的电商平台,视频号小店出现的比小商店要晚一些,所以很多想入驻的新手,在这两者之间容易混淆。 下面我就来跟大家详细的讲一下,这两者之间区别。 1、团队不同 虽然都是腾讯公司…

MySQL——库,表基础操作

目录 一.库的操作 1.显示当前的数据库列表 2.创建数据库 3.字符集和校验规则 4.操纵数据库 5.删除数据库 6.数据库备份与还原 7.查看连接情况 二.表的操作 1.创建表 2.查看表结构 3.修改表 4.删除表 一.库的操作 1.显示当前的数据库列表 show databases; 2.创建数…

KubeKey 离线部署 KubeSphere v3.4.1 和 K8s v1.26 实战指南

作者:运维有术 前言 知识点 定级:入门级了解清单 (manifest) 和制品 (artifact) 的概念掌握 manifest 清单的编写方法根据 manifest 清单制作 artifactKubeKey 离线集群配置文件编写KubeKey 离线部署 HarborKubeKey 离线部署 KubeSphere 和 K8sKubeKey…