并发-synchronized详解

news2024/11/24 6:40:47

JDK1.6之前的synchronized关键字一来就直接给对象加了一把重量级锁,频繁地在用户态和内核态之间切换,导致性能非常低。为了弥补synchronized的不足,大佬doug lee写了一个AQS框架,用Java语言实现了ReentrantLock。然后在JDK1.6之后,oracle优化了synchronized的锁过程,增加了锁的膨胀逻辑。当没有线程来调用synchronized修饰的代码时,synchronized为无锁态,当有一个线程调用时,synchronized由无锁态升级为偏向锁,当有多个线程都调用这块代码时,就会从偏向锁升级到轻量锁状态,这是没有获取到锁的线程就会进行自旋以获取锁。如果自旋太久一直没有获取到锁,就会升级为重量级锁。这个锁的膨胀过程大大提升了synchronized的性能。

对象锁


sy在JDK1.6之前:new Object();的时候jvm天然地维护一个管程monitor,monitor依赖底层的操作系统Mutex【互斥量】,mutex是由操作系统维护的【调操作系统的线程库Pthread】------------------------------为什么效率低呢?涉及到用户态与内核态之间的切换所以效率很低

基于sy锁太重影响性能的前提

开发出ReentrantLock锁,是基于java写的java类归于AQS框架。ReentrantLock可重入、公平性

oracle优化了synchronized的锁过程:
所以JDK1.6及之后,要是锁被一个线程占了,后面的线程就会自旋等待【不需要让出CPU的使用权,一直占着CPU】,浪费一点CPU资源,比阻塞自己回头等另外线程唤醒的效率高的多
只有重量级锁会依赖管程monitor
在这里插入图片描述

sy加锁

sy加在静态方法,锁是加在Class类上
sy加在普通方法,锁加在this,加在当前对象上
new 一个实例对象,对象锁

在同步代码块上sy(object)加锁:monitorenter和monitorexist【有几个,避免发生异常,不释放锁】
在方法上加锁public static synchorized void decrStock(){} 在翻译字节码后会给方法的修饰符加上ACC_synchorized 一标志,这个标志会触发JVM 底层给代码块加monitorenter和monitorexist
对象怎么记录锁的状态的呢

在这里插入图片描述
对象的内存多大:8字节的整数倍
在这里插入图片描述

对象锁的状态就记录在Mark Word,Mark Word大小为4字节大小,32比特大小【32位虚拟机,64位的话也会进行指针压缩】
在这里插入图片描述
匿名偏向—>加入sy对象锁就会偏向锁,并且有指向哪个线程的记录---->多个线程抢3同一把锁的话就会转为轻量级锁---->当自旋等待的时间过长的话就会升级为重量级锁

在加锁的情况下,且处于偏向锁,这时候调用方法要回去hashcode,锁就会升级为轻量级锁,因为偏向锁没有记录hasdcode的地方,升级到轻量级锁后,mark word除了锁状态的其余部分会保存一个指针,指向一个地方,该地址保存初始状态的mark word 信息。如下图![在这里插入图片描述
【稍微更改】注意:调用hashcode方法的时候,就进入无锁,再次进入会升级为轻量级锁
重量级锁hashcode存在管程里
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

\

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

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

相关文章

电脑文件夹怎么设置密码?3个方法为文件加密!

我的电脑里存了很多重要的文件夹,为了防止信息的泄露,我想把这些文件夹都设置密码。但是不知道具体应该如何操作。请求大家的帮助! 我们平常在使用电脑时,可能会将很多重要的文件保存在电脑中。如果不想让别人看到我们这些重要的文…

JMeter安装RabbitMQ测试插件

目录 前言: 具体实现步骤: 1、ant环境搭建 2、AMQP源码下载 3、拷贝JMeter_core.jar包到JMeter-Rabbit-AMQP插件根目录下 4、修改AMQP插件的配置文件 5、打包 6、RabbitMQ客户端插件下载 7、完成以上,重启JMeter创建线程组就可以看到…

智能小家电如何升级Type-C接口充电?

目前市面上智能小家电充电接口还是USB Micor,AC,DC接口等,今年随着欧盟的一纸令下,22年12月24日,欧洲理事会最终批准了“在欧盟范围内统一充电器接口”的法案。这意味着到2024年,usb type-c接口将成为一系列…

openknx初编译

knx协议出来也是很长时间了,但国内相关开发的文章很少,比起zigbee,lora这些网上一搜一大零的,显得可怜。因为公司以后可能会开发knx产品,所以对国外的openknx自已研究了一下。 https://github.com/thelsing/knx 这个就是openknx项…

Openlayers实战,Openlayers调整地图可视范围到多个点组成的多边形边界,可视范围缩放到多个点的中心点

专栏目录: OpenLayers入门教程汇总目录 前言 本片文章详细讲解如何使用Openlayers调整地图可视范围到多个点组成的多边形边界。 也即Openlayers根据多个点坐标生成一个矩形可视范围,并判断当前传入的矩形可视范围是否在当前可视范围内。如果在当前可视范围内,则调整地图中…

latex中两种图并排放,而且各自有小标题caption

\begin{figure*}[htbp] \centering #小标题 \subfigure[Case study in terms of interpretability on dataset HDep3.]{ \begin{minipage}[t]{0.37\linewidth} %linewidth小于0.5 \centering \includegraphics[scale0.2]{figures/hdep3d.png} #大小主要调节scale. %\caption{fi…

Blazor前后端框架Known-V1.2.1

V1.2.1 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行。 概述 基于C#和Blazor实现的快速开发框架,前后端分离,开箱即用。跨平台,单页应用&#xff…

耳挂式骨传导耳机哪个牌子好,分享几个品牌的骨传导耳机

骨传导耳机就是利用震动来传递声音的耳机,在运动时佩戴骨传导耳机,可以听歌也能听周围的声音,提高了运动时的安全性。目前市面上的骨传导耳机也是琳琅满目。今天就来给大家分享下目前市面上比较常见的几款骨传导耳机。希望对正在选购骨传导耳…

Linux v4l2框架分析

1. 概述 V4L2(Video for Linux 2):Linux内核中关于视频设备驱动的框架,对上向应用层提供统一的接口,对下支持各类复杂硬件的灵活扩展; V4L2框架,主要包括v4l2-core、meida framework、videobuf2等模块,这也…

120.【ElastiSearch】

ElasticSearch-初级 (一)、什么是ElasticSearch(库、表、记录)1.ElasticSearch是什么2.ElasticSearch学习路线3.聊聊Doug Cutting4.Lucene 和 ElasticSearch的关系: (二)、ElasticSearch概述1.基本概述2.百度搜索关键字思考3.目前都有哪些公司在用ElasticSearch技术 (三)、ES和…

检验样本是否服从泊松分布

本文以一个订单数据为例,研究顾客购买次数的分布规律,尝试从中估计总体的分布,以对后续的订单数据进行预测或进行业绩的对比。 # 环境准备 import numpy as np import pandas as pd import scipy.stats as stats import matplotlib.pyplot a…

Nginx(3)nginx的Rewrite功能

nginx跨域 Rewrite功能配置Rewrite的相关命令Rewrite的案例域名跳转域名镜像独立域名目录自动添加/合并目录防盗链 Rewrite功能配置 Rewrite是Nginx服务器提供的一个重要基本功能,是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。 注意:Nginx服…

AI生成图片检测器接口,应用于内容审核、虚拟现实应用和促进艺术及设计领域创新等场景

【检测率99.0%以上】可以快速准确地判断一张图片是否为AI生成,减少人工审核的工作量,提高工作效率、降低运营成本,帮助人们更好地管理和利用数字图像资源。广泛应用于内容审核、虚拟现实应用和促进艺术及设计领域创新等场景。 一、效果展示 …

Unity学习笔记--EventSystem事件系统在使用上需要注意的地方(很基础,但是很多人会忘记!!!)

目录 前言代码Unity 场景配置运行报错分析解决办法拓展(预告) 前言 之前有写过一篇关于事件系统实现以及使用的文章 Unity学习笔记–C#事件系统的实现与应用 最近在使用的时候遇到了一些问题,所以在此记录下,也为看到这篇文章的人…

魏副业而战:视频带货借助热点,这个账号月赚20w+

我是魏哥,与其在家躺平,不如魏副业而战! 最近魏哥一直在研究短视频,每天刷刷抖音,经常刷到高考相关的视频。 本来高考跟我没关,毕竟孩子还小,但是刷得多了,魏哥发现有情况。 像这个…

oneAPI人工智能分析工具包实现图像处理

文章目录 一、oneAPI的介绍二、oneAPI实现图像处理环境配置加载预训练模型和网络创建IECore对象和设备插件准备输入数据执行推理总结 一、oneAPI的介绍 oneAPI是一个由英特尔(Intel)主导的、面向异构计算的开放标准和平台。它旨在简化和加速跨多种硬件架…

体验攻略 | 新时代的用研人,没有它不行

用户研究(以下简称“用研”)是随着互联网兴起和发展、从体验设计领域进一步分化出来的岗位。在互联网公司,用研岗位更多以用户体验为导向,主要工作为洞察用户的需求、行为和动机,为产品开发和服务设计提供指导性意见。…

DNS解析:连接互联网的关键步骤

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊 座右铭:不想…

C语言多组输入问题

目录 前言 scanf返回值介绍: EOF又是什么? 一、scanf的返回值等于输入参数的个数 二、scanf的返回值不等于EOF 三、对scanf的返回值按位取反(~) 如何结束? 前言 如果您经常刷题就一定碰到过多组输入的问题&#…

threejs纹理

个人博客地址: https://cxx001.gitee.io 前面我们介绍了各种可以用来覆盖对象的材质,也介绍了如何修改材质的颜色、关泽和不透明度,但是我们还没有详细介绍如何在材质中使用外部图片(也叫纹理). 将纹理应用于材质 1. 加载纹理并应用到网格 纹理最基础…