【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.mfbz.cn/a/241758.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探秘机器学习核心逻辑:梯度下降的迭代过程 (图文详解)

一 需求解函数 f() 和 g()函数分别为求y值和求导数的函数。 目的:求该函数的最小值: 代码: import numpy as np import matplotlib.pyplot as plt f lambda x : (x - 3.5) ** 2 - 4.5 * x 10 g lambda x : 2 * (x - 3.5) - 4.5x np.l…

1.3 什么是接口?什么是接口测试?

上一小节我们认识了C/S和B/S架构,那在B/S架构中,我们测试最常接触的,就是接口。本课程的重点是接口自动化测试,那同学们真的了解什么是接口吗?首先,我们从通俗的角度来看什么是接口。在计算机中,接口是计算机系统中两个独立的部件进行信息交换的共享边界。这种交换可以发…

ARM day8

1.题目&#xff1a;主机获取从机里面的温湿度数据&#xff0c;并打印出来 结果&#xff1a; 代码&#xff1a; main.c #include "iic.h"#include "si7006.h"void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j);}}int main(){short tem;…

ThingsBoard 前端项目轮播图部件开发

前言 ThingsBoard 是目前 Github 上最流行的开源物联网平台&#xff08;14.6k Star&#xff09;&#xff0c;可以实现物联网项目的快速开发、管理和扩展, 是中小微企业物联网平台的不二之选。 本文介绍如何在 ThingsBoard 前端项目中开发轮播图部件。 产品需求 最近接到产品…

自动化测试、压力测试、持续集成

因为项目的原因&#xff0c;前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api。下面将研究的成果展示给大家&#xff0c;希望对需要的人有所帮助。 SoapUI 是什么&#xff1f; SoapUI 是一个开源测试工具&#xff0c;通过 soap/http 来检查、调用、实现 Web Service …

python笔记(1)安装环境

1&#xff0c;官网下载自己电脑位数的安装包 https://www.python.org/downloads/windows/ install时勾选中add to path&#xff0c;把路径自动添加到环境变量 安装pycharm就不讲了 安装后选中自己的python安装包 file-> setting->project:yourprojectname ->pyt…

k8s-8 ingress

ExternalName类型 当集群外的资源往集群内迁移时&#xff0c;地址并不稳定&#xff0c;访问域名或者访问方式等会产生变化&#xff1b; 使用svc的方式来做可以保证不会改变&#xff1a;内部直接访问svc&#xff1b;外部会在dns上加上解析&#xff0c;以确保访问到外部地址。 …

CleanMyMac X2024(Mac优化清理工具)v4.14.5中文版

CleanMyMac X是一款颇受欢迎的专业清理软件&#xff0c;拥有十多项强大的功能&#xff0c;可以进行系统清理、清空废纸篓、清除大旧型文件、程序卸载、除恶意软件、系统维护等等&#xff0c;并且这款清理软件操作简易&#xff0c;非常好上手&#xff0c;特别适用于那些刚入手苹…

数字中台建设指南(大数据平台)

制定数字中台战略规划&#xff1a;制定符合企业实际情况的数字中台战略规划&#xff0c;明确建设目标、重点任务和时间表。确定数字中台架构&#xff1a;根据企业业务需求和特点&#xff0c;确定数字中台的架构&#xff0c;包括技术架构、应用架构和数据架构。搭建数字中台基础…

java设计模式学习之【享元模式】

文章目录 引言享元模式简介定义与用途实现方式 使用场景优势与劣势在Java中的应用享元模式在Spring中的应用画图示例代码地址 引言 想象一下&#xff0c;您正在开发一个游戏&#xff0c;游戏中有成千上万的树木和建筑。如果每个对象都独立存储它的所有数据&#xff0c;将会占用…

postman接口测试系列: 时间戳和加密

在使用postman进行接口测试的时候&#xff0c;对于有些接口字段需要时间戳加密&#xff0c;这个时候我们就遇到2个问题&#xff0c;其一是接口中的时间戳如何得到&#xff1f;其二就是对于现在常用的md5加密操作如何在postman中使用代码实现呢&#xff1f; 下面我们以一个具体的…

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

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

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

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

结合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接口 二、配置…

Nodejs 第二十三章(Markdown 转 html)

Markdown 转换html 是一个非常常见的需求 什么是 Markdown ? Markdown 是一种轻量级标记语言&#xff0c;它允许人们使用易读易写的纯文本格式编写文档。 我们需要用到三个库实现 EJS&#xff1a;一款强大的JavaScript模板引擎&#xff0c;它可以帮助我们在HTML中嵌入动态内…

linux中堡垒机

堡垒机 堡垒机概念目的 安装Jumpserver使用资产管理资产列表创建需要管理的服务器创建用户权限管理页面进行资产授权操作视频 应用管理应用管理页面创建需要管理的应用&#xff0c;这里用数据库mysql举例进入后点击创建资产管理创建登录应用所需的用户选择创建mysql关系型数据库…

IP地址在流量管理中的作用

随着互联网的快速发展&#xff0c;流量管理已成为各行业面临的重要问题。IP地址作为一种标识网络中设备的重要标识符&#xff0c;在流量管理中发挥着重要作用。本文将介绍IP地址在流量管理中的应用&#xff0c;以帮助读者更好地理解这一领域的发展。 一、IP地址的分类与标识 I…

【C++】输入输出流 ⑥ ( cout 标准输出流对象 | cout 常用 api 简介 | cout.put(char c) 函数 )

文章目录 一、cout 标准输出流对象1、cout 标准输出流对象简介2、cout 常用 api 简介 二、cout.put(char c) 函数1、cout.put(char c) 函数 简介2、代码示例 - cout.put(char c) 函数 一、cout 标准输出流对象 1、cout 标准输出流对象简介 cout 是 标准输出流 对象 , 是 ostrea…

聚焦本田XR-V和福特领睿:两大SUV综合实力对比,谁更胜一筹?

在当今的SUV市场中&#xff0c;家庭用户的选择变得越来越多样化。特别是对于那些追求时尚、功能性以及技术先进性的用户来说&#xff0c;选择正确的SUV显得尤为重要。本文将重点对比福特领睿和本田XR-V这两款SUV&#xff0c;探讨它们在各方面的表现&#xff0c;做一个综合实力的…

GPTs prompts灵感库:创意无限,专业级创作指南,打造吸睛之作的秘诀

GPTs prompts灵感库&#xff1a;创意无限&#xff0c;专业级创作指南&#xff0c;打造吸睛之作的秘诀 优质prompt展示 1.1 极简翻译 中英文转换 你是一个极简翻译工具&#xff0c;请在对话中遵循以下规则&#xff1a; - Prohibit repeating or paraphrasing any user instru…