【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,一经查实,立即删除!

相关文章

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

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

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

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

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…

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

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

单片机的低功耗模式介绍

文章目录 简介一、功耗来源说明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蜘蛛有哪些

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

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…

自建zerotier planet服务linux客户端使用

前期准备planet文件, 1.先安装zerotier curl -s https://install.zerotier.com | sudo bash2.安装完毕之后把planet文件上传上去 这个位置 3.加入网络,这里不做创建演示 zerotier-cli join 地址 4.查看planet的ip 直接用bash ifconfig没有的用ip ad…

低代码开发入局,同飞股份应用云表自主开发MES管理系统

近日,为了贯彻落实《“十四五”智能制造发展规划》,推动中国从制造大国向制造强国转变,工业和信息化部发布了2023年度“智能制造优秀场景”名单。经过省级有关部门和中央企业的推荐、专家评审、网上公示等程序,同飞股份凭借其“先…

Python格式化字符串(格式化输出)

Python 提供了“%”对各种类型的数据进行格式化输出,例如如下代码: price 108 print ("the books price is %s" % price) 上面程序中的 print 函数包含以下三个部分,第一部分是格式化字符串(相当于字符串模板&#xff…

Docker | Docker+Nginx部署前端项目

= ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:Docker系列 ✨特色专栏: MySQL学习 🥭本文内容:Docker | Docker+Nginx部署前端项目 📚个人知识库: [Leo知识库]https://gaoziman.gi…

结合eNSP实验讲VLAN,让理论生动

目录 一、VLAN的简介 1、定义 2、产生的原因--解决传统以太网的问题 3、VLAN的作用 4、VLAN数据帧格式--插入VLAN标签 5、VLAN的种类 5.1静态VLAN--常用 5.1.1静态vlan的范围 5.2动态VLAN 6、VLAN的三种端口类型 6.1Access接口 6.2Trunk接口 6.3Hybrid接口 二、配置…

普冉(PUYA)单片机开发笔记(4): 配置通用定时器

概述 在前几篇开发笔记中,从 PY32F003 的一个厂家标准例程开始,实现了中断式无阻塞串口收发、对开发板 LED3 的亮/灭控制,时钟系统的初始化和时钟选择。在此基础上,今天做一下定时器的应用实验。事先考虑以下几个问题&#xff1a…