Java多线程基础知识-2

news2024/10/25 8:22:43

线程的3个方法:

Thread.sleep():当前线程睡眠多少毫秒,让给其他线程去执行。

Thread.yield():当前线程退出一下,进入到等待队列,让其他线程执行,即让出线程一下。

Thread.join():等待另外一个线程的结束。

synchronized关键字:

  • 对象锁:对某个对象加锁,而不是代码
    • 锁对象不能是String常量(容易跟类库中锁对象重复)、Integer(值变会创建新的对象)、Long
  • 可重入锁:

见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No5SynchReentrant

  • 锁异常自动释放:

见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No6SynchExceptionRelease

  • synchronized是排队运行,即按顺序运行:

见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No3SynchLineUp

  • synchronized使用是"对象监视器"
  • 语法:
    • synchronized同步方法
    • synchronized同步代码块
      • synchronized(this) synchronized void m()
      • synchronized(非this对象 x)
        • 在多个线程持有"对象监视器"为同一个对象的前提下,同一个时间只有一个线程可以执行synchronized(非this对象 x)同步代码块中的代码
        • synchronized(非this对象 x)与持有不同的对象监视器方法或代码块是异步的
  • synchronized static void m() 这里相当于 synchronized(T.class)
    • Class类锁与对象锁之间的异步
    • Class类可以对类所有对象实例起作用

锁定某个对象o,如果o的属性发生变化,不影响锁的使用,但是如果o变成另一个对象,则锁定的对象发生改变,应该避免锁定对象的引用变成另外的对象。--> 解决:加final

synchronized底层实现:

前提:基于HotSpot实现的JVM。

synchronized发展:

  • 早期使用重量级的系统锁
  • JDK1.6以后使用锁升级

锁的四种状态:

无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。

锁的优化:

适应性自旋锁、锁消除、偏向锁、锁粗化、偏向锁

Mark Word:

32位:

偏向锁:
  • 偏向锁是在单线程执行代码块时使用的机制,如果在多线程并发的环境下(即线程A尚未执行完同步代码块,线程B发起了申请锁的申请),则一定会转化为轻量级锁或者重量级锁。
轻量级锁(自旋锁):
  • 轻量级锁是为了在线程交替执行同步块时提高性能,而偏向锁则是在只有一个线程执行同步块时进一步提高性能。
  • 修改MarkWord(修改锁状态),拷贝MarkWord到栈的LockRecord中,使用CAS将MarkWord中的LockWord更新为指向当前线程LockRecord的指针
  • 默认自旋10次失败,升级重量级锁
重量级锁:
  • 依赖于操作系统Mutex Lock所实现的锁我们称之为 “重量级锁”
重量级锁、轻量级锁和偏向锁之间转换:

锁升级的详细过程:

底层实现:
  • Java的对象头(Mark Word)和Monitor(监视器)对象是Synchronized实现的基础。Synch基于进入和退出Monitor对象实现的同步,Synch使用的锁是存在于Java对象头中。
  • Synchronized是通过对象内部的一个叫做"监视器锁(Monitor)"来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。
1. 字节码层面:

访问标识(access flags):ACC_SYNCHRONIZED

monitorenter指令 monitorexitr指令

2. JVM层面:

C++ 调用了操作系统提供的同步机制

3. OS和硬件层面(了解):

X86系统 : lock cmpxchg / xxx

https://blog.csdn.net/21aspnet/article/details/88571740

synchronized的经典小题:

1. 不使用synchronized的非线程安全(线程不安全)举例:

见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No1NonThreadSafe

模拟银行账号:对业务写方法加锁,对业务读方法不加锁,这样行不行? -> 容易产生脏读(dirtyRead)

见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No2DirtyRead

2. 同步与非同步方法是否可以同时调用?

可以

见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No4SynchAndNonSynchMethod

3. synchronized在普通方法与静态方法的区别:

普通方法同步范围是该方法,是给对象上锁;静态方法同步范围是该方法,是给Class类上锁,这个类所有的对象竞争一把锁。

锁:

执行时间短(加锁代码),线程数少,用自旋锁

执行时间长,线程数多,用系统锁(重量级锁)

Volatile关键字:

特点:

  • 保证线程可见性;
    • 底层实现:MESI 缓存一致性协议

见com.hanxiaozhang.threadbase1ndedition.no2volatilekeyword.No1VolatileVisibility

  • 禁止指令重排序;
    • DCL单例(Double Check Lock)
    • 底层实现:内存屏障,loadfence原语指令(读屏障),storefence原语指令(写屏障)

见com.hanxiaozhang.threadbase1ndedition.no2volatilekeyword.No2VolatileDisOrder

底层实现:

1. 字节码层面:

增加访问标识(access flags): ACC_VOLATILE

2. JVM层面:

volatile内存区的读写都加屏障

3.OS和硬件层面:

使用hsdis(HotSpot Dis Assembler)工具观察,windows是由lock 指令实现 | MESI实现

https://blog.csdn.net/qq_26222859/article/details/52235930

Tips:

对象初始化过程,分为三步,可能会发生重排序

CAS(Compare And Swap):

介绍:

CAS(CompareAndSwap)中文意思:比较并替换,它是一种无锁算法。CAS有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。

CAS指令执行时,当且仅当V的值与A相等时,将V修改为B,否则就什么都不做,整个CAS操作是一个原子操作。

特点:

CAS是原子操作,CAS具有关键字volatile读和写的内存语义。

三大问题:

  • 循环时间长开销很大;
  • 只能保证一个变量的原子操作;
  • ABA问题。

UnSafe类:

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

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

相关文章

LEVER:根据执行结果来改进语言编码生成的高效方法

译者 | 赵海树 单位 | 东北大学自然语言处理实验室 1.论文介绍 基于大语言模型LLM训练从语言到编码的生成的方向取得了重要进展,基于执行结果的启发式方法以及LLM解码、样本修剪和测试用例重新排序的结合方式成为了当前最为高效的方法。但当前的许多真实世界语言不…

鸿蒙 Web组件的生命周期(api10、11、12)

概述 开发者可以使用Web组件加载本地或者在线网页。 Web组件提供了丰富的组件生命周期回调接口,通过这些回调接口,开发者可以感知Web组件的生命周期状态变化,进行相关的业务处理。 Web组件的状态主要包括:Controller绑定到Web组…

【vue3】for循环多选框勾选必填校验

业务场景&#xff1a; 多选项必选一个&#xff0c;选了的输入框必填 <el-row :gutter"20"><el-col :span"12"><el-form-item label"捆绑终端硬件标识" prop"terminalCodeList"><el-checkbox-groupv-model"…

rmmod无法卸载驱动程序

出现问题&#xff1a; 在加载好驱动程序key_to_led_drv.ko 运行app然后使用ctrlz退出的时候&#xff0c;无法使用rmmod卸载程序 出现问题&#xff1a; 原因进程没有被杀死&#xff1a; 调试过程&#xff1a; 使用lsmod里的信息&#xff1a; used为驱动占用的计数值 当计数…

Java+ffmpeg 合并两个mp4文件

使用ffmpeg测试命令 ffmpeg -i "E:\Monitor\video_20240617_10.mp4" -i "E:\Monitor\video1_20240617_10.mp4" -filter_complex "[0:v][0:a][1:v][1:a]concatn2:v1:a1[v][a]" -map "[v]" -map "[a]" -c:v libx264 -c:a…

数据分析第十一讲:pandas应用入门(六)

pandas应用入门&#xff08;六&#xff09; 我们再来看看Index类型&#xff0c;它为Series和DataFrame对象提供了索引服务&#xff0c;有了索引我们就可以排序数据&#xff08;sort_index方法&#xff09;、对齐数据&#xff08;在运算和合并数据时非常重要&#xff09;并实现…

2024.6.16 机器学习周报

目录 引言 Abstract 文献阅读 1、题目 2、引言 3、创新点 4、匹配问题 5、SuperGlue架构 5.1、注意力图神经网络&#xff08;Attentional Graph Neural Network&#xff09; 5.2、最佳匹配层&#xff08;Optimal matching layer&#xff09; 5.3、损失 6、实验 6.…

裂变客户时代:如何打造口碑传播的良性循环?【以Notion为例】

在当今的商业环境中&#xff0c;客户裂变已经成为品牌增长的重要驱动力。裂变客户时代&#xff0c;意味着每一个满意的客户都有可能成为品牌的传播者&#xff0c;帮助品牌吸引更多的新客户。那么&#xff0c;如何在这个时代打造口碑传播的良性循环呢&#xff1f;Notion是怎么做…

Python 接口自动化测试

一、基础准备 1. 环境搭建 工欲善其事必先利其器&#xff0c;废话不多说。我们先开始搭建环境。 # 创建项目目录mkdir InterfaceTesting# 切换到项目目录下cd InterfaceTesting# 安装虚拟环境创建工具pip install virtualenv# 创建虚拟环境&#xff0c;env代表虚拟环境的名称&…

微信小程序学习(十):生命周期

1、应用生命周期 生命周期说明onLaunch监听小程序初始化&#xff0c;全局只会执行 1 次onShow监听小程序启动或切前台onHide监听小程序切后台 &#x1f517;应用生命周期官方文档 App({/*** 当小程序初始化完成时&#xff0c;会触发 onLaunch&#xff08;全局只触发一次&…

李宏毅深度学习03——神经网络训练不起来怎么办

视频链接 如果Optimization失败的时候&#xff0c;怎么把梯度下降做的更好&#xff1f; 只考虑这种情况&#xff0c;不考虑overfitting 局部最小值&#xff08;local minima&#xff09;和鞍点&#xff08;saddle point&#xff09; 为什么Optimization会失败&#xff1f; …

用AI帮助设计师提升工作效率?

在创意设计的世界里&#xff0c;效率往往意味着灵感与时间的完美结合。设计师们时常面临各种挑战&#xff0c;如何在保证作品质量的同时&#xff0c;又能提升工作效率&#xff1f;这不仅是设计师们思考的问题&#xff0c;也是AI技术正在积极解决的问题。那么&#xff0c;用AI帮…

Unity 工具 之 Azure 微软 【GPT4o】HttpClient 异步流式请求的简单封装

Unity 工具 之 Azure 微软 【GPT4o】HttpClient 异步流式请求的简单封装 目录 Unity 工具 之 Azure 微软 【GPT4o】HttpClient 异步流式请求的简单封装 一、简单介绍 二、实现原理 三、注意实现 四、简单效果预览 五、案例简单实现步骤 六、关键代码 一、简单介绍 Unit…

Spring系统学习 - FactoryBean和基于XML的自动装配

Factory Bean Spring的FactoryBean是一个特殊的Bean&#xff0c;用于创建其他Bean实例。FactoryBean接口定义了一个工厂Bean&#xff0c;该Bean可以用来生成其他Bean的实例。通过实现FactoryBean接口&#xff0c;开发人员可以自定义Bean的创建逻辑&#xff0c;实现更灵活的Bea…

动态竞拍与寄售模式:引领企业增长的新引擎

在当今日新月异的商业环境中&#xff0c;企业的生存与发展不仅需要卓越的产品和服务&#xff0c;更需要紧跟市场脉搏&#xff0c;勇于创新。接下来&#xff0c;我将为您详细介绍一种引领行业新风尚的商业模式——动态竞拍与寄售相结合的模式。这一模式凭借其灵活性和创新性&…

图像处理与视觉感知复习--频率域图像增强图像变换

文章目录 图像变换与信号分解正弦信号与傅里叶级数傅里叶变换离散傅里叶变换(DFT)频率域滤波 图像变换与信号分解 空间域&#xff1a;就是像素域&#xff0c;在空间域的处理是在像素级的处理&#xff0c;如像素级的叠加。 频率域&#xff1a;任何一个波形都可以分解用多个正弦…

【类型转换】C++中char、char*、int、string相互转换函数及string转不同进制数函数

参考资料&#xff1a;cplusplus官方资料strtol 函数用法 总结&#xff1a; 1、这些在做编程题处理输入数据时常用&#xff0c;需要牢记。

【CT】LeetCode手撕—23. 合并 K 个升序链表

目录 题目1- 思路2- 实现⭐23. 合并 K 个升序链表——题解思路 3- ACM 实现 题目 原题连接&#xff1a;23. 合并 K 个升序链表 1- 思路 模式识别&#xff1a;合并 K 个链表 ——> 优先队列 思路 借助优先队列&#xff0c;每次从 k 个链表中&#xff0c;各取一个元素&…

前 OpenAI 首席科学家建「安全超级智能」实验室;Meta 重组元宇宙团队丨 RTE 开发者日报 Vol.228

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

Cytoscape之操作界面介绍

Cytoscape 简介 Cytoscape是一个专注于开源网络可视化和分析的软件。软件的核心部分提供了网络显示、布局、查询等方面的基本功能。软件的核心可以通过插件架构进行扩展&#xff0c;这样就能快速地开发出新的功能。 Cytoscape 源自系统生物学&#xff0c;用于将生物分子交互网…