Java多线程基础知识-2

线程的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类:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW_TDMS

1.TDMS设置属性 想给这里写属性怎么整 使用TDMS设置属性函数时,对组名称与通道名称不设置,即可达到上图中的样式。 PS:属性名称如果设置一样则最终生效的值为最后写入的值。如将属性2修改为属性1,则最终只有1个属性1&#xff0c…

Pikachu靶场--文件上传

参考借鉴 Pikachu靶场之文件上传漏洞详解_皮卡丘文件上传漏洞-CSDN博客 文件上传漏洞&#xff1a;pikachu靶场中的文件上传漏洞通关_pikachu文件上传通关-CSDN博客 client check 在桌面新建一个文件夹&#xff0c;准备一个hello.php文件&#xff0c;文件写入如下代码 <?p…

Safari浏览器下载文件时,文件名会URL encoded

问题&#xff1a;相同链接下载文件&#xff0c;safari文件名编码异常 解决&#xff1a;response.setHeader("Content-Disposition", "attachment;filename*utf-8" URLEncoder.encode(filename, "UTF-8")); 问题描述 谷歌下载&#xff08;正常&a…

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

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

2024年6月11日树莓派正式上市!

​Raspberry Pi 已在伦敦证券交易所上市&#xff0c;股票代码为 Raspberry Pi Holdings plc。 这是 Raspberry Pi 的分水岭&#xff0c;也是发展新阶段的开始&#xff1a;进入公开市场将使树莓派能够更快地制造出更多我们喜爱的产品。Raspberry Pi 基金会在首次公开募股中筹得的…

网络文化经营许可证:互联网时代的护航之舵

文网文由中国文化和旅游部&#xff08;原文化部&#xff09;颁发&#xff0c;旨在对网络文化活动进行规范管理&#xff0c;确保文化内容的健康积极。通过对文化市场的严格监管&#xff0c;文网文有效杜绝了低俗、违法、侵权等不良现象的发生。网络文化市场的良性发展&#xff0…

第四届人工智能、机器人和通信国际会议(ICAIRC 2024)

第四届人工智能、机器人和通信国际会议&#xff08;ICAIRC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 2024年12月27-29日 | 中国厦门 重要信息 会议官网&#xff1a;www.icairc.net 录用通知时间&…

Lucene重要特性及应用案例

文章目录 Elasticsearch Python 示例Lucene Java 示例Elasticsearch Python 示例进阶&#xff1a;多字段搜索与排序Lucene Java 示例进阶&#xff1a;使用TermQuery进行精确匹配 Lucene底层存储结构&#xff1a; Lucene作为高性能的全文搜索引擎库&#xff0c;其底层存储结构设…

【C++】类和对象(三)构造与析构

文章目录 一、类的6个默认成员函数二、 构造函数干嘛的&#xff1f;语法定义特性综上总结什么是默认构造函数&#xff1f; 三、析构函数干嘛的 &#xff1f;语法定义析构顺序 一、类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中并不是真的什么…

不懂索引,简历上都不敢写自己熟悉SQL优化

大家好&#xff0c;我是考哥。 今天给大家带来MySQL索引相关核心知识。对MySQL索引的理解甚至比你掌握SQL优化还重要&#xff0c;索引是优化SQL的前提和基础&#xff0c;我们一步步来先打好地基。 当MySQL表数据量不大时&#xff0c;缺少索引对查询性能的影响不会太大&#x…

在react项目中让webpack使用mock数据

1. 创建react项目 使用 create-react-app 创建项目 npx create-react-app react-mock 执行 eject 命令 npm run eject 删除 package.json 文件中的 eslintConfig 选项 2. 安装依赖包 npm i path-to-regexp fast-glob chokidar axios 3. 创建中间件 在 config 文件夹中创…

Android【SDK】 SDK是如何开发的,怎么打包aar包

文章目录 一、Android SDK开发示例工程二、Android SDK的开发三、打包aar包四、Android SDK的使用 一、Android SDK开发示例工程 本教程工程Git链接&#xff1a;https://gitcode.com/xiaohuihui1400/AndroidSdkExample/overview 二、Android SDK的开发 新建项目&#xff0c;…

Linux驱动开发笔记(九)IIC子系统及其驱动

文章目录 前言一、IIC驱动框架二、总线驱动2.1 iic总线的运行机制2.2 重要数据结构2.2.1 i2c_driver结构体2.2.2 i2c总线结构体 2.3 匹配规则 三、设备树的修改四、设备驱动的编写4.1 相关API函数4.1.1 i2c_add_adapter( )4.1.2 i2c_register_driver( )4.1.3 i2c_transfer( )4.…

MDK-ARM 编译后 MAP 文件分析

本文配合 STM32 堆栈空间分布 食用更佳&#xff01; 一图胜千言。。。

【LLM之NL2SQL】DAIL-SQL论文阅读笔记

研究背景 该研究旨在提供一个全面、系统的评估框架&#xff0c;用于评估基于大型语言模型&#xff08;LLM&#xff09;的Text-to-SQL技术。特别强调了不同的提示工程策略的有效性和效率&#xff0c;以及开源LLM的可行性。研究的重点是评估在零样本和少样本场景下的不同问题表示…

ICC2如何写DCG需要的floorplan信息

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 DCG需要哪些floorplan信息呢? 1)fixed属性的port和mem / ip / io 2)boundary信息 3)电源域形状 前两条都可以写到def里,电源域需要用脚本处理,这里分享一下脚本。 set_fixed_objects [ge…

# 消息中间件 RocketMQ 高级功能和源码分析(七)

消息中间件 RocketMQ 高级功能和源码分析&#xff08;七&#xff09; 一、 消息中间件 RocketMQ 源码分析&#xff1a;消息存储核心类介绍 1、消息存储在 store 模块中。消息存储核心类 DefaultMessageStore.java 2、消息存储核心类介绍 private final MessageStoreConfig me…

react18 实现具名插槽

效果预览 技术要点 当父组件给子组件传递的 JSX 超过一个标签时&#xff0c;子组件接收到的 children 是一个数组&#xff0c;通过解析数组中各 JSX 的属性 slot &#xff0c;即可实现具名插槽的分发&#xff01; 代码实现 Father.jsx import Child from "./Child";…

DNF安卓分离仅是开始:游戏厂商积极布局自有渠道,市场变革在即

毫无征兆&#xff0c;DNF手游今天突然宣布从各大安卓平台下架。 《地下城与勇士:起源》运营团队于6月19日发布声明&#xff0c;指出因合约到期&#xff0c;游戏将不再上架部分安卓平台的应用商店。然而&#xff0c;这一事件并非完全无迹可循。 早在2021年初&#xff0c;华为游…

ROM以及ROM与RAM对比

1.ROM ROM最原始的定义是“只读存储器”&#xff0c;一旦写入原始信息则不能更改。所以ROM通常用来存放固定不变的程序、常数和汉字字库&#xff0c;甚至用于操作系统的固化。它与随机存储器可共同作为主存的一部分&#xff0c;统一构成主存的地址域。 现在已经发展出了很多R…