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

面试-细聊synchronized

1.线程安全问题的主要诱因:

存在多条共享数据(临界资源)
存在多条线程共同操作这些共享数据

解决问题的根本方法:
同一时刻有且仅有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后在对共享数据进行操作。
在这里插入图片描述

2.synchroized锁

在这里插入图片描述
在这里插入图片描述
分析:
补充:
synchronized用于解决同步问题,当有多条线程同时访问共享数据时,如果不进行同步,就会发生错误,java提供的解决方案是:只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他线程不能进来执行可以。解决这个问题。这里在用synchronized时会有两种方式,一种是上面的同步方法,即用synchronized来修饰方法,另一种是提供的同步代码块。
同步就是:一个对象同一时间只能为一个同步代码块服务
同步代码块需要传递的对象(锁对象):就是锁住这个对象,表示这个对象正在为我服务,其他人不能用(非synchronized代码块、方法除外)。
同步方法:就是同步代码块,同步锁对象是this
同步静态方法:就是同步代码块,同步锁对象是类的class对象(Demo类里的静态方法锁对象就是Demo.class)。
当锁的是不同的对象:相当于没有锁机制,皆为异步。

3.synchronize底层实现原理

(1)实现synchronized的基础
Java对象头
Monitor:

hotspot虚拟机对象在内存中的分布区域分为3块:
对象头:一般而言,synchronized使用的锁对象是存储在java对象头里的。
Mark World是存储运行时自身数据,实现偏向锁和轻量级锁的关键。class metadata address是类型指针指向对象的类元数据,JVM通过这个指针确定该对象是哪个类的数据。
实例数据
对齐填充
在这里插入图片描述
在运行期间,Mard Word里存储的数据会随着锁标志位的变化而变化。Mark Word可能变化为存储以下数据结构。
在这里插入图片描述

Monitor:每个java对象天生自带了一把看不见的锁(内部锁)监视器锁。可以
理解为同步机制。
通过ObjectMonitor实现,C++实现。与锁池与等待池相关。
在这里插入图片描述
分析:
每个对象锁的线程都会被封装成ObjectWaiter来保存到里面。其中有个字段owner用来保存持有Object-monitor的线程。当多个线程同时访问同一段同步代码的时候,首先会进入到EntryList里面。当线程获取到对象的Monitor之后,就进入对象Object区域。并把owner对象设置为当前线程,count就会加一。若线程调用wait方法,释放当前持有的Monitor.owner会被回复成null,count=0。该线程即ObjectWaitor实例就会进入到waitsSet集合中等待被唤醒。若当前线程执行完毕,它也将释放Monitor锁,并复位其他变量的值,以便其他线程进入获取Monitor锁。
在这里插入图片描述
Monitor对象存在每个java对象的对象头中,synchronized锁便是通过这种方式去获取锁的。这也是java中任意对象可以作为锁的原因。
在这里插入图片描述
同步语句块的实现是同过Monitorenter与Monitorexit实现的。
Monitorexit指明同步代码块的结束位置,当执行Monitorenter指令时,当前线程将试图获取对象锁,即ObjectMonitor 所对应的monitor所对应的持有权。当count= 0时,线程就可以成功的获得Monitor,并将计数器设置为1,表示取锁成功。如果已经拥有锁的持有权,可以重入。
当其他线程持有锁,当前线程会阻塞在Monitorenter指令。
方法级的同步是隐式的。通过实现。
在这里插入图片描述
(2)synchronized的发展与优化
什么是重入:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过while(true)实现而不是sleep实现,不想放弃cpu的执行时间。
早在java4就有,当时默认是关闭的,java6后,默认为开启状态。
在这里插入图片描述
优化:
锁消除:(优化)
JIT编译时,对运行上下文进行扫描,去除不可能存在竞争的锁,可以节省毫无意义的请求锁时间。
代码demo:代码中的sb变量是不可能被线程共享的资源,JVM会自动消除内部的锁。
在这里插入图片描述
在这里插入图片描述
锁粗化(另一种极端):(缩小同步作用范围,即只在共享数据的实际作用范围。
频繁的互斥同步锁操作,会导致不必要的性能操作。):
通过扩大加锁的范围,避免反复加锁和解锁
在这里插入图片描述
(3)synchronized的四种状态
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(4)锁的内存语义
在这里插入图片描述
线程A释放锁,线程B获取锁,这个过程的实质是线程A通过主内存向线程B发送消息,而之前的MarkWorld可以理解为是位于主存。而位于栈里的DisplayMarkWorld则是位于线程中的本地内存的。既然线程A已经可以确保可以将DisplayMarkWorld同步到MarkWorld中,也就意味着完成了对共享数据的操作。也就表明已经可以解锁,并且表明已经解锁成功了。

相关文章:

面试-细聊synchronized

1.线程安全问题的主要诱因: 存在多条共享数据(临界资源) 存在多条线程共同操作这些共享数据 解决问题的根本方法: 同一时刻有且仅有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后在对共享数据进行操作。 2.synchroized锁 分…...

AI降重新突破:chatgpt降重工具在学术论文中的应用与效果

论文降重一直是困扰各界毕业生的“拦路虎”,还不容易熬过修改的苦,又要迎来降重的痛。 其实想要给论文降重达标,我有一些独家秘诀。话不多说直接上干货! 1、同义词改写(针对整段整句重复) 这是最靠谱也是…...

Spring学习02-[Spring容器核心技术IOC学习]

Spring容器核心技术IOC学习 什么是bean?如何配置bean?Component方式bean配合配置类的方式import导入方式 什么是bean? 被Spring管理的对象就是bean,和普通对象的区别就是里面bean对象里面的属性也被注入了。 如何配置bean? Component方式、bean配合配置类的方式、import…...

2024上海CDIE 参展预告 | 一站式云原生数字化平台已成趋势

为什么企业需要进行数字化转型?大家都在讨论的数字化转型面临哪些困境?2024.6.25-26 CDIE数字化创新博览会现场,展位【A18】,期待与您相遇,共同探讨企业如何利用数字化技术驱动业务增长。 一、展会介绍——CDIE数字化…...

高考专业组 07组 08组 武汉大学

武汉大学的招生都什么废物点心,搜个专业组都没官方解释! 07组:理学,详见下表专业代码07xxxx,例如数学、物理、化学 08组:工学,详见下表专业代码08xxxx,例如机械、电子信息、自动化、…...

解析JavaScript中逻辑运算符和||的返回值机制

本文主要内容:了解逻辑运算符 &&(逻辑与)和 ||(逻辑或)的返回值。 在JavaScript中,逻辑运算符 &&(逻辑与)和 ||(逻辑或)的返回值可能并不总…...

Java中的数据结构与算法探秘

Java中的数据结构与算法探秘 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 引言 数据结构与算法是计算机科学的基础,对于Java程序员来说&#x…...

AST反混淆实战|嵌套的赋值语句通用还原处理

关注它,不迷路。 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除! 1.混淆代码 下面的这段代码是来自px3验证码核心混淆代码: function _u…...

Unity的ScrollView滚动视图复用

发现问题 在游戏开发中有一个常见的需求,就是需要在屏幕显示多个(多达上百)显示item,然后用户用手指滚动视图可以选择需要查看的item。 现在的情况是在100个data的时候,Unity引擎是直接创建出对应的100个显示item。 …...

详解Spring AOP(二)

目录 1.切点表达式 1.1execution表达式 1.2 annotation 1.2.1自定义注解MyAspect 1.2.3添加自定义注解 2.Sping AOP原理 2.1代理模式 2.1.1静态代理 2.1.2动态代理 2.1.3JDK动态代理 2.1.4CGLIB动态代理 3.总结 承接上文:详解Spring AOP(一&…...

sql-analysis

文章目录 痛点: 1、无法提前发现慢sql,可能恶化为慢sql的语句 2、线上出现慢sql后,无法快速止损 后果:一般是以响应时间来发现慢sql,这时候已经对业务产生了一定影响,这时候就要改代码重新发布上线或者改数…...

后台管理台字典localStorage缓存删除

localStorage里存放了如以下dictItems_开头的字典数据,localStorage缓存是没有过期时间的,需要手动删除。同时localStorage里还存有其他不需要删除的数据。 这里的方案是遍历localStorage,利用正则和所有key进行匹配,匹配到dict…...

计算机毕业设计PySpark+Hadoop招聘推荐系统 招聘大数据 招聘数据分析 招聘可视化 大数据毕业设计 大数据毕设

1. 管理端: 带有职位的增删改查功能,评论功能是针对新闻模块的,类似新闻大数据的实现 2. 网站端: python / java 协同过滤推荐算法 / 下载职位数据表收费1元每条 / 账户充值 / 短信验证码修改密码 / 身份证识别 / 多条件搜索 3.…...

.Net预定义的泛型委托

我们每次要使用一个委托前&#xff0c;都需要自定义这个委托类型&#xff0c;声明其参数和返回值&#xff0c;然后才能实例化委托类型的对象、最后调用委托对象。 为了简化这个过程&#xff0c;.Net预定义了Func<T>委托、Action<T>委托类型和Predicate<T>&a…...

Unity的Excel转表工具

该Excel工具主要由Python语言完成&#xff0c;版本为3.x 主要功能&#xff1a; 1.转换后的数据存储结构为二进制。 2.excel文件可以选择多种数据类型&#xff1a;int、float、string、一维&#xff08;int、float、string&#xff09;、二维int、Map&#xff08;int/int、in…...

静态随机存储器(SRAM):高速缓存的奥秘

目录 基本的静态存储单元阵列 基本的SRAM逻辑结构 1. 概述 2. SRAM阵列 3. 行选择器&#xff08;Row Decoder&#xff09; 4. 列选择器&#xff08;Column Decoder&#xff09; 5. 读写电路 6. 控制电路 7. 工作过程 SRAM的读/写时序 SRAM 结构概述 读操作时序 读…...

Linux CentOS 7 服务器集群硬件常用查看命令

&#xff08;一&#xff09;查看内核&#xff1a;uname -a [rootcdh1 ~]# uname -a Linux cdh1.macro.com 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux&#xff08;二&#xff09;查看系统&#xff1a;cat /etc/redhat-releas…...

《Windows API每日一练》5.4 键盘消息和字符集

本节我们将通过实例来说明不同国家的语言、字符集和字体之间的差异&#xff0c;以及Windows系统是如何处理的。 本节必须掌握的知识点&#xff1a; 第31练&#xff1a;显示键盘消息 非英语键盘问题 字符集和字体 第32练&#xff1a;显示默认字体信息 第33练&#xff1a;创建逻…...

【uniapp】uniapp开发微信小程序入门教程

HBuilderx中uniapp开发微信小程序入门教程 一、 环境搭建 1. HBuilderx下载安装 HBuilderx下载安装地址 2. 微信开发者工具下载安装 微信开发者工地址具下载安装 二、创建uniapp项目 选择&#xff1a;文件>新建>项目>uni-app 输入项目名称>选择默认模板>…...

Python爬虫项目集:豆瓣电影排行榜top250

关于整理日常练习的一些爬虫小练习&#xff0c;可用作学习使用。 爬取项目以学习为主&#xff0c;尽可能使用更多的模块进行练习&#xff0c;而不是最优解。 爬虫概要 示例python 库爬取模块request解析模块BeautifulSoup存储类型list&#xff08;方便存入数据库&#xff09…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...