面试-细聊synchronized

news2024/11/16 3:46:11

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中,也就意味着完成了对共享数据的操作。也就表明已经可以解锁,并且表明已经解锁成功了。

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

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

相关文章

边缘计算为企业解决数据问题,提升业务效率和竞争力-天拓四方

企业在当前数字化时代面临着一系列具体的问题和挑战,这些问题往往与数据处理、实时响应、安全性以及运营成本等方面密切相关。边缘计算作为一种新兴的计算模型,能够有效地帮助企业解决这些问题,提升业务效率和竞争力。 首先,企业…

清华、北大与微软推出Glyph-ByT5-v2,精准生成文字海报,支持10种语言,效果炸裂

前言 在 AI 领域,文生图技术已经取得了令人惊叹的进展,但如何将文字精准地融入图像,并支持多种语言,一直是研究人员面临的挑战。为了解决这一难题,清华大学、北京大学和微软亚洲研究院的研究人员合作推出了 Glyph-ByT…

网络安全等级保护测评

网络安全等级保护 《GB17859 计算机信息系统安全保护等级划分准则》 规定计算机信息系统安全保护等级共分五级 《中华人民共和国网络安全法》 “国家实行网络安全等级保护制度。 等级测评 测评机构依据国家网络安全等级保护制度规定,按照有关 管理规范和…

泰迪智能科技与成都文理学院人工智能与大数据学院开展校企合作交流

近日,在推动高等教育与产业深度融合的背景下,成都文理学院人工智能与大数据学院携手广东泰迪智能科技股份有限公司开展“专业建设交流会”。人工智能与大数据学院院长胡念青、院长助理陈坚、骨干教师刘超超、孙沛、赵杰、文运、胡斌、邹杰出席本次交流会…

二级web基础操作题练习

---------要求--------- 利用HTML和CSS实现如图所示页面: ---------代码示例--------- 分析:该页面包含一个标题、一个副标题、“姓名信息”的表格,并且有一段文字提示用户仔细填写,使用内联CSS来控制HTML页面的视觉外观&…

TiDB 资源管控的对撞测试以及最佳实践架构

作者: GreenGuan 原文来源: https://tidb.net/blog/bc405c21 引言 TiDB 是一个存算分离的架构,资源管控对这种分离的架构来说实现确实有非常大的难度,TiDB 从 7.1 版本开始引入资源管控的概念,在社区也有不少伙伴测…

SpringUtils.getBean 空指针异常问题

因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。 今天在新的jeecg-boot里加入下面的代码 /*** 部门经理处理类** author nbacheng* date 2023-08-06*/ AllArgsConstructor Component("DepManagerHandler") DependsOn({"Sp…

el-form重置后input无法输入问题

新增用户遇到的问题: 如果你没有为 formData 设置默认值,而只是将其初始化为空对象 {},则在打开dialog时,正常输入, formdata会变成如下 但是,打开后,直接使用 resetFields 或直接清空表单&…

封装vuetify3中v-time-picker组件,并解决使用时分秒类型只能在修改秒之后v-model才会同步更新的问题

目前时间组件还属于实验室组件&#xff0c;要使用需要单独引入&#xff0c;具体使用方式查看官网 创建公共时间选择器组件 common-time-pickers.vue 子组件页面 <template><div><v-dialog v-model"props.timeItem.isShow" activator"parent&q…

vxe-list做列表虚拟滚动时,底部间距的优化

已知vxe-list在数据超出一定行时会自动启用纵向虚拟滚动配置&#xff0c;默认效果如图&#xff1a; 但是在滚动中我们发现有时列表底部间距不一致&#xff0c;而且会出现在感官上底部空白过多的情况&#xff1a; 这时候我们想让列表恰好显示完全应该怎么做呢&#xff0c;查看官…

DLS平台:GPT-5预计于2025年底至2026年初发布,将实现“博士水平”智能

摘要 OpenAI首席技术官Mira Murati近日透露&#xff0c;GPT-5可能推迟到2025年底或2026年初发布。这一消息打破了市场对GPT-5在2023年底或2024年夏季发布的预期。尽管推迟&#xff0c;但GPT-5将实现显著的性能飞跃&#xff0c;在特定任务中达到“博士水平”的智能。这标志着人…

.NET开源的实时应用监控系统 - WatchDog

项目介绍 WatchDog是一个开源&#xff08;MIT License&#xff09;、免费、针对ASP.Net Core Web应用程序和API的实时应用监控系统。开发者可以实时记录和查看他们的应用程序中的消息、事件、HTTP请求和响应&#xff0c;以及运行时捕获的异常。 项目工作原理 它利用SignalR进…

jupyter中如何看plt.plot的局部细节

在Jupyter中使用matplotlib时&#xff0c;如果你想要放大图表的某一部分&#xff0c;可以使用matplotlib的交互式方式查看局部细节。 %matplotlib notebook # 在Jupyter中使用交互式后端 import matplotlib.pyplot as plt import numpy as np# 生成数据 x np.linspace(0, 10…

C# 信号量的使用

学习来源&#xff1a;《.net core 底层入门》 第六章第9节&#xff1a;信号量 案例&#xff1a;主线程负责添加数据&#xff0c;子线程负责获取数据 使用SemaphoreSlim&#xff08;轻信号量&#xff09;实现&#xff1a; using System; using System.Collections.Generic; us…

Openldap安装部署及Gitea简单配置使用

Openldap安装部署及Gitea简单配置使用 一.安装Openldap #拉取镜像 docker pull osixia/openldap:latestdocker run \ -d \ -p 389:389 \ -p 636:636 \ -v /home/data/openldap/local:/usr/local/ldap \ -v /home/data/openldap/lib:/var/lib/ldap \ -v /home/data/openldap/s…

Python 3.12 环境搭建(Windows版)

目录 1. 下载Python 3.12安装包2. 安装Python 3.123. 验证安装5. &#xff08;可选&#xff09;配置其他开发工具 在Windows系统中搭建Python 3.11环境&#xff0c;可以按照以下步骤进行&#xff0c;以确保过程清晰且详细&#xff1a; 1. 下载Python 3.12安装包 打开浏览器&a…

【Docker】Consul 和API

目录 一、Consul 1. 拉取镜像 2. 启动第一个consul服务&#xff1a;consul1 3. 查看consul service1 的ip地址 4. 启动第二个consul服务&#xff1a;consul2&#xff0c; 并加入consul1&#xff08;使用join命令&#xff09; 5. 启动第三个consul服务&#xff1a;consul3&…

Games101 正交投影矩阵推导

目录 正交投影 投影矩阵推导 正交投影 正交投影不管是远处还是近处&#xff0c;都是直接挤在屏幕上就好&#xff0c;它没有近大远小的效果 首先&#xff0c;把相机放在原点上&#xff0c;往-z方向看&#xff0c;上方向是y&#xff1b; 这样摆放相机的好处是&#xff0c;把…

前端HTML/CSS知识点系列

1. 什么是块级格式化上下文&#xff1f;【BFC(Block formatting context)】 BFC&#xff08;Block FormattingContext&#xff0c;块级格式化上下文&#xff09;是一个独立的渲染区域&#xff0c;其中的元素的布局不会受到外部元素的影响&#xff0c;反之亦然。BFC的创建有助于…

深度学习工具|LabelImg(标注工具)的安装与使用教程

1 简介 Label是一款免费的图像标注软件&#xff0c;可以以矩形框的形式对图像中的物体进行标记&#xff0c;常用于分类和目标检测。并可以将标记信息保存为PasclVOC&#xff08;xml&#xff09;、YOLO&#xff08;txt&#xff09;、CreateML&#xff08;json&#xff09;格式。…