Java并发面试题:(四)synchronized和lock区别

news2025/7/11 15:06:09

synchronized 关键字

synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它
修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外,在 Java 早期版本中,
synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的
Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一
个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核
态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高,这也是为什么早期的synchronized 效率低的原因。庆幸的是在 Java 6 之后 Java 官方对从 JVM 层面对synchronized 较
大优化,所以现在的 synchronized 锁效率也优化得很不错了。JDK1.6对锁的实现引入了大量的优
化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。

synchronized和lock区别

在这里插入图片描述

synchronized 关键字的底层原理

synchronized 关键字底层原理属于 JVM 层面。
① synchronized 同步语句块的情况

public class SynchronizedDemo {
 public void method() {
 synchronized (this) {
  System.out.println("synchronized 代码块");
 }
 }
}

synchronized 同步语句块的实现使用的是 monitorenter 和 monitorexit 指令,其中
monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置。 当
执行 monitorenter 指令时,线程试图获取锁也就是获取 monitor(monitor对象存在于每个Java对象的
对象头中,synchronized 锁便是通过这种方式获取锁的,也是为什么Java中任意对象可以作为锁的原
因) 的持有权.当计数器为0则可以成功获取,获取后将锁计数器设为1也就是加1。相应的在执行
monitorexit 指令后,将锁计数器设为0,表明锁被释放。如果获取对象锁失败,那当前线程就要阻塞等待,直到锁被另外一个线程释放为止。

② synchronized 修饰方法的的情况

public class SynchronizedDemo2 {
 public synchronized void method() {
 System.out.println("synchronized 方法");
 }
}

synchronized 修饰的方法并没有 monitorenter 指令和 monitorexit 指令,取得代之的确实是
ACC_SYNCHRONIZED 标识,该标识指明了该方法是一个同步方法,JVM 通过该 ACC_SYNCHRONIZED 访问标志来辨别一个方法是否声明为同步方法,从而执行相应的同步调用。

synchronized 锁的优化机制

从JDK1.6版本之后,synchronized本身也在不断优化锁的机制,有些情况下他并不会是一个很重量
级的锁了。优化机制包括自适应锁、自旋锁、锁消除、锁粗化、轻量级锁和偏向锁。锁的状态从低到高依次为无锁->偏向锁->轻量级锁->重量级锁,升级的过程就是从低到高,降级在一定条件也是有可能发生的。
在这里插入图片描述

  1. 偏向锁:在锁对象的对象头中记录⼀下当前获取到该锁的线程ID,该线程下次如果⼜来获取该锁就可以直接获取到了

  2. 轻量级锁:由偏向锁升级⽽来,当⼀个线程获取到锁后,此时这把锁是偏向锁,此时如果有第⼆个线程来竞争锁,偏向锁就会升级为轻量级锁,之所以叫轻量级锁,是为了和重量级锁区分开来,轻量级锁底层是通过⾃旋来实现的,并不会阻塞线程

  3. 如果⾃旋次数过多仍然没有获取到锁,则会升级为重量级锁,重量级锁会导致线程阻塞

  4. ⾃旋锁:⾃旋锁就是线程在获取锁的过程中,不会去阻塞线程,也就⽆所谓唤醒线程,阻塞和唤醒这两个步骤都是需要操作系统去进⾏的,⽐较消耗时间,⾃旋锁是线程通过CAS获取预期的⼀个标记,如果没有获取到,则继续循环获取,如果获取到了则表示获取到了锁,这个过程线程⼀直在运⾏中,相对⽽⾔没有使⽤太多的操作系统资源,⽐较轻量。

Java对象结构

Java对象由三个部分组成:对象头、实例数据、对齐填充。

1、对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记录数组长度。

2、实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)

3、对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐)

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

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

相关文章

“Web 3.0引领未来:下一代互联网技术将来袭!“

"下一代互联网技术,称为Web 3.0或Web3,主要利用机器学习、人工智能(AI)和区块链技术。" 与 Web2 相比,Web3 为消费者提供了对其在线数据的更多自主权,而Web2 专注于托管在”集中式“网站上的用户…

rv1126-rv1109-yaffs2-mkyaffs2image610

今天使用了一下yaffs2功能 就是生成一个yaffs的包 从移植的角度先生成ro_1109.yaffs包 烧录进去 操作步骤: 创建和生成ro文件夹和 mkyaffs2image610可执行程序 然后用 fakeroot ./mkyaffs2image610 ro ro_1109.yaffs 1 2生成了ro_1109.yaffs 例: …

无人机航拍图像拼接与目标识别

一、简介 无人机用来做图像侦察是常见功能,现有技术基本是无人机对某片区域进行飞行,人工实时监控飞行图像,将图像录制成视频供事后回放。此方法对人员业务要求比较高、反应速度足够快、不利于信息收集、录制视频丢失空间信息、对于后期开展区…

Ubuntu20网络总是连接失败,查看ip只有ipv6,没有ipv4

对于连接失败。 将网络适配器改成桥接模式。 原先使用的 NAT模式导致连接失败。 对于只有ipv6没有ipv4 是因为没有勾选桥接模式的物理状态。 当然可能还有其他原因,其他的就只能百度了。 继续点击网络适配器。 勾选复制物理网络连接状态。

【分享】一个基于 Python 开发的12306 抢票项目,快来学习!

哈喽,大家好,我是木易巷~ 12306抢票软件 "黄金周" 十一黄金周如约而至,这意味着某些开源项目又将迎来一次繁荣的热潮。这次,上榜的是一个与 12306 抢票相关的脚本,它基于 Python 编写,具备自动…

超全整理,性能测试——数据库索引问题定位+分析(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、数据库服务器添…

堆排序代码模板

#include<iostream> using namespace std; const int N 1e5 9; int h[N], n, m, Size;//小根堆//u表示三个点中的根节点 void down(int u) {int t u;//设t为三个点中最小的那个点//如果左儿子存在并且小于根节点就将左儿子赋值给tif (u * 2 < Size && h[u …

SourceTree 这是一个无效的源路径/URL

原因&#xff1a;权限检测出现问题 解决&#xff1a; ssh-add /Users/haijunyan/.ssh/id_rsa ssh-add -K /Users/haijunyan/.ssh/id_rsa 稍后&#xff0c;重新测试&#xff1a; 备注&#xff1a; https://www.ngui.cc/el/1727107.html?actiononClick

哪些企业适合做私域?

什么是私域&#xff1f; 简单直白来说&#xff0c;就是不用花钱就可以触达客户的渠道。私域流量就是私人的流量&#xff08;不用花钱&#xff09;。 哪些企业适合做私域&#xff1f; 》复购率高 比如美妆护肤产品行业、餐饮等快消品行业。 可通过群发推广消息、朋友圈营销和在…

01案例 - 财政收入影响因素分析及预测模型

01案例 - 财政收入影响因素分析及预测模型 案例背景 在我国现行的分税制财政管理体制下&#xff0c;地方财政收人不仅是国家财政收入的重要组成部分&#xff0c;而且具有其相对独立的构成内容。如何有效的利用地方财政收入&#xff0c;合理的分配&#xff0c;来促进地方的发展…

React create-react-app 里配置代理(解决跨域)

配置代理&#xff1a; creact-react-app v5 当然不是v5 下面的方法也适用。 方式一&#xff1a;package.json里配置 其实 cra里给了个简单的配置代理 就是在package.json里加上proxy就行了。 修改时需要 npm start重新运行一下&#xff0c;要不然可能不生效。 proxy只能以 h…

vueday02——使用naive-ui做一个ACM看榜

效果展示&#xff1a; 组件导入 <n-data-table:data"data":columns"column":bordered"true":single-line"false"/> 行数据导入数据结构 {key: 1,index: 2,name: user Name2,passNum:0,// age: 42,college: JiShou University…

Java RSA密钥从RSAPrivateKey和RSAPublicKey对象中,分别提取模和指数

概述&#xff1a; 在Java编程中&#xff0c;我们经常用到如下一段代码来生成RSA公私钥&#xff0c;分别拿到公私钥然后加解密计算&#xff1a; KeyPairGenerator keyPairGen; keyPairGen KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(2048, new S…

竞赛选题 深度学习YOLO抽烟行为检测 - python opencv

文章目录 1 前言1 课题背景2 实现效果3 Yolov5算法3.1 简介3.2 相关技术 4 数据集处理及实验5 部分核心代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习YOLO抽烟行为检测 该项目较为新颖&#xff0c;适合作为竞赛课…

C-Net:用于乳腺超声图像分割的具有全局指导和细化残差的级联卷积神经网络

C-Net 期刊分析摘要贡献方法整体框架1. Bidirectional attention guidance network (BAGNet)2. Refinement residual network (RFNet) 实验1. 对比实验2. 消融实验 可借鉴参考 期刊分析 期刊名&#xff1a; Computer Methods and Programs in Biomedicine 期刊信息&#xff1a…

圣树唤歌最强阵容2023,圣树唤歌阵容推荐

无疑圣树唤歌作为一款备受欢迎的手机游戏&#xff0c;其深刻的战斗系统一直以来都受到大家的追捧。在这个虚拟世界中胜利的关键在于组建一支无懈可击的强大队伍&#xff0c;要想成为强者&#xff0c;就必须拥有最强阵容。 关注【娱乐天梯】&#xff0c;获取内部福利号 在本篇攻…

【C++11新特性】右值引用和移动语义(移动构造,移动赋值)

文章目录 前言一、列表初始化&#xff08;不同于初始化列表&#xff09;二、initializer_list三、decltype关键字四、nullptr五、右值引用移动拷贝和移动赋值被编译器识别成将亡值的原因 左值引用和右值引用的场景和价值右值引用的场景move函数 六、关于右值引用的功能和属性问…

【HTML+CSS】零碎知识点

公告滚动条 <!DOCTYPE html> <html><head><title>动态粘性导航栏</title><style>.container {background: #00aeec;overflow: hidden;padding: 20px 0;}.title {float: left;font-size: 20px;font-weight: normal;margin: 0;margin-left:…

23款奔驰C260L升级小柏林音响 15个喇叭 是多了哪两个

22款奔驰C级在音响系统方面也做出了改变&#xff0c;20款奔驰C级的小柏林音响是13喇叭590瓦功率&#xff0c;小柏林音响是多了哪两个喇叭呢&#xff1f;也就是眼镜盒上的两个&#xff0c;在之前的C级车型上&#xff0c;小柏林是没有这两个扬声器的。无论是小柏林还是大柏林&…