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

【Java面试】十七、并发篇(上)

文章目录

  • 1、synchronized关键字的底层原理:Monitor
  • 2、synchronized相关
    • 2.1 为什么说synchronized是重量级锁
    • 2.2 synchronized锁升级之偏向锁
    • 2.3 synchronized锁升级之轻量级锁
  • 3、Java内存模型JMM
  • 4、CAS
    • 4.1 CAS流程
    • 4.2 CAS底层实现
  • 5、volatile关键字的理解
    • 5.1 可见性
    • 5.2 禁止指令重排

1、synchronized关键字的底层原理:Monitor

synchronized互斥锁,同一时刻,最多只有一个线程能持有对象锁。用javap拿到synchronized示例代码的字节码信息:

在这里插入图片描述

javap -v SyncTest.class

可以看到synchronized底层自己上锁、解锁(解锁两次是怕出现异常后导致锁不能释放,第二个解锁相当于finally里释放锁)

在这里插入图片描述

Monitor,监视器,由JVM提供,c++实现。每个对象实例都会有一个Monitor对象,Monitor的结构:

在这里插入图片描述

线程Thread1执行到synchronized代码块,如果对象的Monitor对象的Owner属性为null,则抢锁成功,后面其他线程再进来抢锁,就进入EntryList阻塞,直到Thread1执行完释放锁,EntryList里的线程又开始争抢锁(并非先来后到的排队),WaitSet即存调用了wait方法的线程

在这里插入图片描述

2、synchronized相关

2.1 为什么说synchronized是重量级锁

Java应用中的线程是用Thread对象来操作的,JVM负责维护Java线程和操作系统原生线程之间的映射关系。阻塞和唤醒一个线程,都需要CPU参与,而调用硬件资源CPU只能是内核态操作,且Java对象锁通过Monitor实现,Monitor又通过操作系统的互斥量Mutex Lock实现。

因此,加解锁、阻塞线程、唤醒线程等就涉及到了用户态和内核态的频繁切换(两个空间的一些变量的值拷贝),synchronized代码块短的话,可能切换的时间比代码执行时间还长。所以synchronized称为重量级锁。

在这里插入图片描述
鉴于此,JDK6以后,为synchronized引入轻量级锁和偏向锁的概念,避免一下就捅到重量级锁,以尽量减少用户态和内核态的切换次数。

2.2 synchronized锁升级之偏向锁

优化场景:一个锁一直被一个线程持有。如买票时发现线程t3一直在执行卖票的synchronized代码块

在这里插入图片描述
偏向锁会偏向于第一个访问锁的线程,如果在接下来的运行过程中,该锁没有被其他的线程访问,则持有偏向锁的线程将永远不需要触发同步,也即偏向锁在资源没有竞争情况下消除了同步语句。

【syncoronized偏向锁】

2.3 synchronized锁升级之轻量级锁

优化场景:两个线程近乎可以错开交替执行, 或者说是有锁竞争, 但竞争不激烈的情况,获取锁的冲突时间极端,本质就是CAS自旋锁,不要直接往重锁走。

【syncoronized轻量锁】

在这里插入图片描述

总之, synchronized的偏向锁和轻量级锁都是为了缓冲, 尽量避免走Monitor + 操作系统的互斥变量来实现加解锁, 以减少用户态和内核态的切换, 实现性能提升

3、Java内存模型JMM

定义了线程工作内存和主内存之间读写操作的规范

在这里插入图片描述

每个线程有自己的工作内存, 每块线程的工作内存之间相互隔离, 操作同一个变量时, 可通过主内存分别save和load

【JMM】

4、CAS

4.1 CAS流程

比较再交换,Compare And Swap,一种乐观锁的思想,在无锁的状态下保证线程操作数据的原子性,CAS广泛用于AQS框架、AtomicXXX类

  • 当前工作内存的值V
  • 旧的预期值A
  • 即将更新,写回主内存的值B

示意代码:

在这里插入图片描述

t1线程从主内存读到i=5,+1后准备把6写回主内存,此时,比较期望值5和内存中的实际i值,若相等,则乐观的认为自己运算的期间没有其他线程修改i,就将i写回主内存。反之,比如主内存i=6,那t1就再来一次,i=6,i+1,期望6,此时如果主内存i=6,则写回成功,反之继续自旋。

在这里插入图片描述

CAS的优势是没有加锁,线程不会陷入阻塞,效率高,反之,如果竞争激烈,频繁失败自旋重试,效率低且消耗CPU

4.2 CAS底层实现

底层通过Unsafe类来直接调用操作系统底层的CAS指令,来保证原子性,CAS对应在底层是CPU的一条原子指令cmpxchg

在这里插入图片描述

最后,CAS体现乐观锁的思想是,不担心自己操作期间别的线程修改了共享变量,如果被改了就吃点亏再重执行一次,反正我从主内存读数据、在工作内存读数据、写回主内存三步不可再分,有原子性保证,撑死多试几次才能修改数据成功

反之,synchronized则是悲观锁,自己操作时要防着其他线程改共享变量,上个锁,我改完解锁之后,别的线程才有机会

5、volatile关键字的理解

volatile修饰的变量 :

  • 保证线程间的可见性
  • 禁止进行指令重排序

5.1 可见性

volatile的可见性,即保证不同线程对某一个变量一旦完成更改,其他线程立即可见,因为会从线程的工作内存立马刷到主内存

在这里插入图片描述

执行结果:

在这里插入图片描述

结果分析:三个线程操作一个共享变量stop,线程1改了stop的值,一会儿线程2就读到了这个变化,但线程3却一直在循环,这是因为JVM的即时编译器JIT对一直执行的热点代码做了优化:

在这里插入图片描述

可加JVM参数-Xint禁用掉即时编译器,但得不偿失,可给共享变量加stop,JIT不会对volatile变量做优化且volatile变量会立即刷回主内存

static volatile boolean stop = true;

重新运行,显示循环16038233次后,读到stop变量变为true了:

在这里插入图片描述

5.2 禁止指令重排

看个案例:用@Actor注解保证方法内u的代码在同一个线程下执行

在这里插入图片描述

以上代码,并发测试下出现1 ,0 的结果,说明发生了重排序:

在这里插入图片描述
用volatile修饰变量,在读写共享变量时加入屏障,阻止其他读写操作越过屏障,以阻止指令重排序

//改为这样
int x;
volatile int y;

此时,并发测试下不再有1 ,0 的结果,屏障如下:

在这里插入图片描述
如果给x加volatile,则还是有1, 0 的结果

//改为这样
volatile int x;
int y;

因为此时的插入的屏障位置如下:

在这里插入图片描述
上面,volatile修饰x还是y,这是一个volatile的使用技巧问题:

  • 写变量让 volatile 修饰的变量的在代码最后位置
  • 读变量让 volatile 修饰的变量的在代码最开始位置

详见:volatile读写屏障

相关文章:

【Java面试】十七、并发篇(上)

文章目录 1、synchronized关键字的底层原理:Monitor2、synchronized相关2.1 为什么说synchronized是重量级锁2.2 synchronized锁升级之偏向锁2.3 synchronized锁升级之轻量级锁 3、Java内存模型JMM4、CAS4.1 CAS流程4.2 CAS底层实现 5、volatile关键字的理解5.1 可见…...

七天进阶elasticsearch[one]

elasticSearch 概述 Elasticsearch是一个近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个很小的延迟(通常是一秒) 集群 一个集群就是由一个或多个节点组织在一起, 它们共同持有你全部的数据&#x…...

全新抖音快手小红书视频解析去水印系统网站源码

这个系统支持几十种平台,包括抖音、快手小红书以及其他热门社交媒体平台。它可以帮助轻松地下载这些平台上的任何视频,并去除其中的水印,让你可以自由地保存和分享这些视频。 使用方法: 上传压缩包解压,网站信息在inc…...

图解 Python 编程(12) | 文件和编码方式

🌞欢迎来到Python 的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 📆首发时间:🌹2024年6月9日&am…...

CSDN个人主页动态地图(前端/后端)

前段时间有人问我,关于CSDN个人主页动态地图的实现,我来解答一下。 这里要注意一下:使用CSDN的API需要遵循其开发者协议和使用规范,确保你的使用方式符合相关规定 前端部分: 创建一个HTML页面作为个人主页。在页面上放…...

GUI编程-01

组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事件 破解工具 Java提供了丰富的图形用户界面(Graphics User Interface,GUI)的类库,基于这些类库可以编写窗口程序。 Java关于图形界面的类库主要放在…...

Linux网络-自定义协议、序列化和反序列化、网络计算服务器的实现和Windows端客户端

文章目录 前言一、自定义协议传结构体对象 序列化和反序列化什么是序列化?反序列化 二、计算器服务端(线程池版本)1.main.cc2.Socket.hpp3.protocol.hpp4.Calculator.hpp5.serverCal.hpp6.threadPool.hpp7.Task.hpp8. log.hpp 客户端Windows客…...

Hive知识体系保姆级教程

一. Hive概览 1.1 hive的简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。 其本质是将SQL转换为MapReduce/Spark的任务进行运算,底层由HDFS来提供数据的存储,说白了h…...

三大网络简介

一、三大网是哪三大网 三大网络为电话网、电视广播网、互联网,如果这三大网络使用都是“ip分组交换”技术的话,他们将会被融合成为一个网络, 但是由于历史原因,他们使用了不同的通信技术,三大网各自拥有相当的独立性&a…...

Element-UI全面入门与实战技巧

本文详细介绍了Element-UI的安装、配置、组件使用、布局技巧、交互设计、表单处理、主题定制等内容,旨在帮助开发者快速掌握Element-UI,并能在实际项目中灵活应用。 文章目录 一、Element-UI概述与安装1.1 Element-UI简介1.2 环境搭建1.3 安装Element-UI…...

第103天: 权限提升-Linux 系统辅助项目脏牛Dirty内核漏洞SUIDGUID

项目下载地址 综合类探针: https://github.com/liamg/traitor 自动化提权: https://github.com/AlessandroZ/BeRoot 信息收集: https://github.com/rebootuser/LinEnum https://github.com/sleventyeleven/linuxprivchecker 漏洞探针&#xf…...

如何用群晖当异地组网服务器?

在当今信息化时代,远程通信成为了企业和个人之间不可或缺的一部分。特别是对于跨地区的通信需求,一个可靠的异地组网服务器是必不可少的。而群晖(Synology)作为一款功能强大的网络存储设备,可以被用作办公室或家庭的异…...

文件怎么去重?5个技巧,教你删除重复文件!

一般来说,在处理大量文件时,你可能会遇到重复的类似文件。这些文件占据了电脑上不必要的磁盘空间,导致系统性能下降。而这些文件可以是不同类型的,如照片、视频、音频、存档、文档等。正因如此,您需要通过文件去重来删…...

标准发布实施 | 《村镇污水处理一体化集成装备技术规范》

根据《中华人民共和国标准化法》以及国家标准化管理委员会、民政部联合制定的《团体标准管理规定》,依据全国团体标准信息平台和《中华环保联合会团体标准管理办法(试行)》,全国团体标准《村镇污水处理一体化集成装备技术指南》&a…...

人工智能--教育领域的运用

文章目录 🐋引言 🐋个性化学习 🦈体现: 🦈技术解析: 🐋智能辅导与虚拟助手 🦈体现: 🦈技术解析: 🐋自动评分与评估 &#x1f…...

【设计模式深度剖析】【3】【行为型】【职责链模式】| 以购物中心客户服务流程为例加深理解

👈️上一篇:命令模式 | 下一篇:策略模式👉️ 设计模式-专栏👈️ 文章目录 职责链模式定义英文原话直译如何理解呢? 职责链模式的角色1. Handler(抽象处理者)2. ConcreteHandler(具体处理者…...

评价GPT-4的方案

评价GPT-4的方案 引言: 随着人工智能技术的不断发展,自然语言处理领域取得了显著的突破。其中,GPT-4作为最新的大型语言模型之一,备受关注。本方案旨在对GPT-4进行全面评价,包括其技术特点、性能表现、应用场景以及潜在的影响等方面。 一、技术特点 1. 模型规模和参数数…...

LeetCode | 1624.两个相同字符之间的最长子字符串

这道题拿到手想法就是去双重遍历暴力解,对于每个字符,从后往前遍历字符串,找到从后往前一直到本次遍历的这个字符串这段子串中和这个字符串相同的字符位置,然后得到子字符串的长度,和ans存储的值做一个比较&#xff0c…...

【CS.AI】GPT-4o:重新定义人工智能的新标杆

文章目录 1 序言2 GPT-4o的技术亮点3 GPT-4o与前代版本的对比3.1 热门AI模型对比表格GPT-3.5GPT-4GPT-4oBERTT5 3.2 其他 4 个人体验与感受5 结论 1 序言 嘿,大家好!今天要聊聊一个超级酷的AI新突破——GPT-4o!最近,OpenAI发布了…...

野火FPGA跟练(四)——串口RS232、亚稳态

目录 简介接口与引脚通信协议亚稳态RS232接收模块模块框图时序波形RTL 代码易错点Testbench 代码仿真 RS232发送模块模块框图时序波形RTL 代码Testbench 代码仿真 简介 UART:Universal Asynchronous Receiver/Transmitter,异步串行通信接口。发送数据时…...

Qt for Android 申请摄像头权限

步骤 1. 添加用户权限 方式1: AndroidManifest.xml 中新增&#xff08;不添加后面申请选项时不弹窗&#xff09; 或者再Qt Creator中直接添加 方式2: .pro 中引用multimedia 模块&#xff0c;编译时配置自动添加 <uses-permission android:name"android.permissi…...

kivy 百词斩项目 报错

AttributeError: FigureCanvasKivyAgg object has no attribute resize_event AttributeError: FigureCanvasKivyAgg object has no attribute resize_event 是一种常见的Python错误&#xff0c;当你试图访问一个对象&#xff08;在这个例子中是 FigureCanvasKivyAgg 对象&am…...

ChatTTS 文字生成语言本地模型部署

ChatTTS部署 官方信息 [ChatTTS首页](https://chattts.com/)搭建步骤 1、下载源码 git clone https://github.com/2noise/ChatTTS.git 2、按照环境 pip install torch ChatTTS pip install -r requirements.txt 3、下载模型 git clone https://www.modelscope.cn/pzc163/ch…...

多曝光融合算法(三)cv2.createAlignMTB()多曝光图像融合的像素匹配问题

文章目录 1.cv2.createAlignMTB() 主要是计算2张图像的位移&#xff0c;假设位移移动不大2.多曝光图像的aline算法&#xff1a;median thresold bitmap原理讲解3.图像拼接算法stitch4.多曝光融合工具箱 1.cv2.createAlignMTB() 主要是计算2张图像的位移&#xff0c;假设位移移动…...

C/C++|类型推导中的模式匹配

在C11及以上的相关语法中&#xff0c;特别是在模版元编程的范式里&#xff0c;类型推导是了重中之重。 在 《Effective Modern C 》 中第一章主要就是讲各种类型推导。 当然了&#xff0c;谈到类型推导&#xff0c;我们不得不先搞懂类型推导中的模式匹配&#xff0c;这是基础&a…...

The 18th Northeast Collegiate Programming Contest(5/9/13)

心得 赛中ac&#xff1a;5&#xff0c;目前ac&#xff1a;9&#xff0c;题目总数&#xff1a;13 中档可做题还是很多的&#xff0c;可惜遇到了难绷的queueforces&#xff0c; 最后15min才判出来&#xff0c;oi赛制5wa4遗憾离场&#xff0c;赛后把几个题都给调过了&#xff0…...

Vue前端在线预览文件插件

Vue前端在线预览文件插件 一、使用场景 1.1.像文档资料等&#xff0c;只想让他人在线预览&#xff0c;但不能下载。此等场景需求可以用到此插件。 二、此文档介绍两种插件 1.view.xdocin插件 (上线后免费几天&#xff0c;然后收费&#xff0c;添加作者后&#xff0c;可以延…...

【ai】Audio2Face

Audio2Face 简介 Audio2Face是英伟达Omniverse平台的一部分,它使用先进的AI技术来生成基于音频输入的逼真面部动画。这个技术主要利用深度学习模型来解析人声,进而驱动一个三维模型的面部表情。下面是Audio2Face工作流程的详细说明: 预备阶段 在使用Audio2Face之前,需要准…...

2024.6.9 一

装饰器(Decorators) 装饰器是 Python 的一个重要部分。简单地说&#xff1a;他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短&#xff0c;我们在用到装饰器时,常用到一个的符号,这个叫做语法糖,在函数定义前加上decorator_name&#xff0c; 那么后面的函数执行…...

地图之战争迷雾/地图算法/自动导航(一)

战争迷雾 TiledMap 创建黑色覆盖块&#xff0c;然后使用碰撞组件&#xff0c;控制黑色块的显示和隐藏 地图算法 在有些游戏中&#xff0c;地图需要随机生成&#xff0c;比如游戏中的迷宫等&#xff0c;这就需要地图生成的算法&#xff1b;在角色扮演类游戏中&#xff0c;角色…...

网站现在如何做推广/google 推广优化

Node&#xff0c;节点&#xff0c;一切的基础。 由OGRE的学习中最大的收获是在自写引擎时形成了一个设计框架&#xff0c;即由NODE形成的一种设计模式。 一个Node&#xff0c; 有关系属性&#xff1a;父&#xff0c;子&#xff0c;兄节点 有变化属性&#xff1a;位置&#xff0…...

5000多一年的网站建站/哪个公司的网站制作

环境&#xff1a;Navicat Premium 15、 win10 1909 一、创建表空间 二、创建用户并授权 三、建表&#xff0c;插入数据 四、其他命令 创建表空间 -- 创建表空间并设置表空间名 CREATE tablespace "表空间名" -- 设置文件名 建议和表空间名保持一致 datafile xxx 或…...

wap网站制作工具/如何创建一个网址

Scala集合的mutable和immutable解释概述集合API概述概述 Scala 集合类系统地区分了可变的和不可变的集合。可变集合可以在适当的地方被更新或扩展。这意味着你可以修改&#xff0c;添加&#xff0c;移除一个集合的元素。而不可变集合类&#xff0c;相比之下&#xff0c;永远不会…...

淘宝做网站/网络游戏推广平台

为了让美化上传文件框&#xff0c;设置了cursor:pointer;,然而不起作用&#xff0c;设置font-size:0&#xff0c;这样就可以了。转载于:https://www.cnblogs.com/mmykdbc/p/10531976.html...

大展建筑人才网/关键词排名优化易下拉霸屏

上面的命令可以帮助我们将命令的返回值输入到文件之中,这也就是重定向的作用. 其中: > 和 >> 的区别. >> 表示追加,>表示覆盖操作. 因此,我们一般更多的会使用>>来进行输出. 案例: 上面的命令就是将ll -al 查看 /etc文件下面的内容,然后将这个返回值输…...

wordpress 热门排行/百度seo优化包含哪几项

在spring的配置文件中配置的bean&#xff0c;spring会进行依赖注入和初始化对象。 根据配置不同&#xff0c;spring会选择不同的代理方式。对于JDK动态代理、cglib动态代理&#xff0c;spring会找到目标接口的实现类并初始化一个对象&#xff0c;对于Dubbo的consumer&#xff…...