javaEE初阶————多线程进阶(1) - 教程

news/2025/9/26 22:36:28/文章来源:https://www.cnblogs.com/ljbguanli/p/19114430

javaEE初阶————多线程进阶(1) - 教程

今天我们开始学习多线程的进阶部分啦,这部分很像八股文,我们其实可能应用的很少,但是可能面试我们会被问到的,来学习吧;

1,常见锁策略

锁策略呢,并不是java独有的,如果需要我们自行去实现一个锁,我们就要遵循锁策略,但是synchronized和ReentrantLock实际上已经很够用了,技多不压身,下面正式开始介绍;

1)乐观锁和悲观锁

乐观锁和悲观锁呢,指的是当前锁具有乐观和悲观的特性,而不是说某一个特定的锁,他们都是加锁时候的场景,会判断锁的处境是乐观还是悲观的;

乐观:就是在加锁的时候,预测接下来的锁竞争并不激烈,不需要做额外的工作,不真正加锁,直接访问;

悲观:加锁的时候,预测接下来的锁竞争很激烈,需要做一些工作来解决,访问共享数据之前先加锁;

乐观锁的实现可以引入一个版本号,借助版本号来识别当前数据的版本号是否存在访问冲突;

悲观锁的实现就是先加锁(操作系统的mutex),获取到锁在真正的操作数据;

2)重量级锁和轻量级锁

轻量级锁和重量级锁就是遇到乐观场景和悲观场景的解决方案;

轻量级锁:在乐观的情况下,付出更高的代价,低效,大量内核态用户切换,很容易引发线程调度;

重量级锁:在悲观的情况下,付出更小的代价,高效,少量内核态用户切换,不容易引发线程调度;

大家还记得内核态和用户态我们在哪里讲过吗,没错(我才你答对了),就是线程池,我们之前说为啥要引出线程池呢,有一个原因就是,自己创建线程是需要到内核态去的,是不可控的,而使用线程池是在用户态,是我们可控的;

3)挂起等待锁和自旋锁

挂起等待锁呢就是重量级锁的典型实现,自旋锁就是轻量级锁的典型实现

挂起等待锁:操作系统内核级别的,加锁的时候发现竞争,就会让线程进入阻塞状态,这个阻塞是不占用cpu的,后续的唤醒也需要内核来唤醒,即使当前的锁没有竞争了,我们也不会直接拿到它,会一直阻塞;

自旋锁:应用程序级别的,加锁的时候发现竞争,不会让线程进入阻塞状态,会一直占用cpu,会一直忙等;

4)普通互斥锁和读写锁

普通互斥锁就是锁的特性,一个线程占有了当前的锁,其他的锁就要阻塞等待并且不可剥夺

读写锁呢就是读加锁和读加锁直接是不互斥的读加锁和写加锁之间是互斥的写加锁和写加锁之间也是互斥的,有同学可能会有疑问,加锁不是为了保证线程安全吗,读加锁和读加锁之间不互斥难道没有线程安全吗,读操作是原子的,不涉及到修改,所以是没有问题的;

读写锁是适用于特定场景下的,适用于读多写少的情况下,比如写小说,写操作只有作者一人,而读就有很多很多了,读加锁和写加锁操作互斥为了保证不读一个不完整的数据;

5)可重入锁和不可重入锁

我们之前讨论死锁的时候说过,一个线程一把锁怎么造成死锁,要获取锁的时候再次获取锁,让两个锁达成“2:我要锁,1:不行,你先上一边去,我要过去就能释放锁了,2:你先把锁给我我才能走开啊,1:我得先走开才能释放啊‘’,他俩就这样一直僵持着;

造成这种情况就因为这个锁具有不可重入的特性,而可重入锁就不会有这样的情况;

一个线程一把锁,可以连续多次加锁;

6)公平锁和非公平锁

公平锁就是先来后到,谁先来的,谁就获得当前的锁;

非公平锁就是概率均等,什么时候来,你获得锁的概率就是一样的;

可能感觉概率均等才是公平的,但是你把锁想像成打饭阿姨你就觉得公平锁真不错;

_____________________________________________________________________________

2,CAS

1,什么是CAS

CAS 即 compare and swap 比较和交换,CAS是CPU上的一条指令,它有三个参数,一个是内存地址,另两个都是寄存器的值,我们要表内存地址和寄存器1的值是否相等,如果相等就把寄存器2的值赋值给内存地址;

2,CAS有哪些应用
1)实现原子类

我们之前讲过,我们要保证原子性要去对某些操作加锁,但是我们刚才谈到CAS是原子的,我们就用它构造出了很多可以具有原子性的类,来代替基本的类型;

public class Demo1 {
public static void main(String[] args) throws InterruptedException {
AtomicInteger a = new AtomicInteger();
Thread thread = new Thread(()->{
for (int i = 0; i {
for (int i = 0; i < 10000; i++) {
a.incrementAndGet();
}
});
thread.start();
thread1.start();
thread.join();
thread1.join();
System.out.println(a.get());
}
}

方便吧;

2)实现自旋锁

CAS还能实现自旋锁的伪代码,为啥是伪代码,CAS毕竟CPU上的指令,java代码中没有具体的代码让我们看到,我们用伪代码的方式来呈现,

public class Demo1 {
private Thread t1 = null;
public void lock(){
while(!CAS(this.t1,null,Thread.currentThread())){};
}
public void unlock(){
this.t1 = null;
}
}

还记得什么是自旋锁吗,我们如果没有拿到当前线程会一直处于忙等的状态,直到拿到线程为止,我们这个代码就是,我们创建了一个线程,当这个线程要加锁的时候,我们看看当线程是不是为null,看看这个锁是不是被其他线程占有,如果t1不为null,那就继续循环,继续等待,直到,没人占用这个锁,就对当前线程加锁; 

3,CAS的ABA问题
1)什么是ABA问题

我们学过,CAS是CPU的一段指令,它的工作原理是比较和交换,既然是原子的那就完全没有线程安全问题了吗,我们来举一个极端的例子,我们把A改成B,之后另一个线程过来吧B改成A,我们第三个线程过来的时候看此时数据还是A,那不就是没改吗,可实际代码已经改过一次了;

2)ABA问题引来的BUG

我们在通常情况下ABA问题带来的影响是不大的,但是存在一种极端情况,我们现在有1000块钱,我们去ATM取钱,我们通常会狂按几下那个取款键,

3)解决方案

我们可以引入版本号,版本号只能加不能减,这样就能有效避免ABA问题了,类似一种标记吧;        

_____________________________________________________________________________

3,synchronized原理

1,基本特点

synchronized是自适应锁,JVM会统计每个锁的竞争激烈程度,如果竞争激烈,就会变成重量级的挂起等待锁(悲观),反之就是轻量级的自旋锁(乐观),

synchronized还是互斥锁,非公平锁,可重入锁;

2,加锁工作过程

锁升级,synchronized为啥优秀呢,它是能一步步升级为了应对不同的情况;

0)无锁

没加锁,还没进入synchronized的代码块;

1)偏向锁

进入synchronized之后并不真正的加锁,而是做一个标记,标记非常轻量,效率很高;

如果运行过程中,没有任何线程来抢竞争这个锁,一直运行到当前代码,最终解释代码时也只是清除标记,并没有涉及到真正的加锁和解锁;

2)轻量级锁

如果当前synchronized是偏向锁的时候,有锁想要竞争了,此时由只是做一个标记改为轻量级锁,赶在其他锁之前抢占它,其他锁去阻塞等待;

3)重量级锁

JVM发现锁的竞争十分激烈的时候就会把轻量级锁转换为重量级锁;

synchronized是不能降级的,只能升级;

我们来举一个好玩的例子,是我的老师给我们举的例子,比如我们是一个女生,我们和一堆男生搞暧昧,但是不确定关系,我们搞暧昧这个行为就相当于偏向锁,没有真正的加锁,但是当我们感觉到我们搞暧昧的男生要被人追走了的时候,我们就立刻和他确定关系,来完成加锁;

3,其他的优化操作
锁消除

锁消除也是编译器优化的一种体现,比如我们此时有一个线程,我们对代码去加锁,显然是没有必要的,虽然我们的代码上是这么写的,但是我们JVM在代码运行时就把他优化掉了;

锁粗化

锁的粒度,加锁和解锁中间包含的代码越多(这里只运行时间,执行的指令),锁的粒度就越粗,

什么意思呢,来看代码;

synchronized (object){
count++;
}
synchronized (object){
count++;
}
synchronized (object){
count++;
}
return count;
}

这就属于代码细粒度,JVM就会把让他粗度化,

synchronized (object){
count++;
count++;
count++;
}

这样的,这下大家理解了吧,编译器会帮助我们优化无意义的锁竞争, 给大家讲一个例子,我们给领导打电话的时候,我们要汇报工作情况,我们打电话,跟领导说,我第一个任务做的怎么怎么样,领导说好,我们挂断电话,之后再打电话,跟领导说我第二个任务做的怎么怎么样,领导说嗯,我们挂掉电话,继续打,跟领导说我们第三个任务........,领导..............;哈哈哈哈哈,是不是感觉到不合理了,我们应该一次电话把三次工作全部汇报完,这就是锁粗化存在的意义;

_____________________________________________________________________________

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

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

相关文章

Ubuntu Linux 常用命令

Ubuntu Linux 常用命令更新软件包 sudo apt update sudo apt upgrade 查看CPU占用情况 sudo apt-get install htop 删除程序 如果你知道要删除软件的具体名称,可以使用 sudo apt-get remove --purge 软件名称 sudo …

软工9.26

今天学了很多,了解到了double类型数值在进行运算时精度的问题,还有包装类型。

漂亮的蓝色网站足球直播在线直播观看免费cctv5

在Python中&#xff0c;你可以编写一个函数来判断一个数是否为素数。素数是指只有1和它本身两个正因数&#xff08;不包括1本身&#xff09;的自然数。以下是一个简单的示例代码&#xff1a; python复制代码 def is_prime(n): if n < 1: return False if n < 3: return …

购物网站开发的背景济宁网站建设 企业谷

文章目录1. 下载2. 启动1. 下载 https://github.com/MicrosoftArchive/redis/releases 2. 启动 进入redis的bin目录双击redis-server.exe

网络安全周报:AI监控工具与关键基础设施漏洞警报

本期网络安全周报汇总了2024年11月17日至24日的关键事件,涵盖美军网络AI监控工具试点、水务系统关键漏洞警告、能源威胁分析中心启动等13个重要新闻,呈现全球网络安全最新动态与威胁态势。2024年11月17日 — 11月24日…

云主机建多个网站电器企业网站建站

武装部三维电子沙盘-行动路径规划分析平台是一款集成了大数据、云计算、虚拟现实、物联网、AI等先进技术的综合性系统。它真实模拟地形、地貌、地物&#xff0c;结合地理空间专业数据、执勤兵力部署、基干民兵信息、普通民兵信息、潜力资源信息、军队相关专业数据、兵要地志数据…

做网站 中文字体是用什么asp商业网站源码

项目开发总结报告&#xff08;GB8567——88&#xff09;1引言1.1编写目的说明编写这份项目开发总结报告的目的&#xff0c;指出预期的阅读范围。1.2背景说明&#xff1a;a&#xff0e; 本项目的名称和所开发出来的软件系统的名称&#xff1b;b&#xff0e; 此软件的任务提出者、…

重链抗体(IgG2、IgG3)与传统抗体的核心区别:从结构到功能的全方位解析

在骆驼科动物(如单峰驼、羊驼)的免疫系统中,同时存在两类功能与结构差异显著的抗体 —— 传统抗体(以 IgG1 为代表)与重链抗体(IgG2、IgG3)。二者的区别不仅体现在分子结构的 “有无轻链” 这一核心特征上,更延…

9.26总结

1.今天复习了算法运用了顺序运算 2.明天用链式运算从新解决 3.收获很大

asp网站gzip压缩咖啡的网站建设策划书

bug&#xff1a;每次刷新页面都有这个鬼弹窗。 刚开始以为是自己的代码问题&#xff0c;于是我翻遍了每一行代码&#xff0c;硬是没找出问题。 后来在网上找了些资料&#xff0c;原来是引入的问题。 解决方案&#xff1a; 改一下引入方式即可。 错误姿势 import Vue from …

告别照相馆!这些小软件让你轻松搞定证件照!

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

重点行业数字化转型一图参透 - 智慧园区

重点行业数字化转型一图参透附:14个行业结构示意图

RustDesk:免费开源的跨平台远程桌面解决方案

RustDesk RustDesk 是一款用 Rust 语言开发的开源远程桌面和远程控制软件。提供屏幕共享、键盘鼠标控制、文件传输、剪贴板同步和文本聊天等核心功能,还具备跨平台特性,支持 Windows、macOS、Linux、Android、iOS 等…

学校部门网站建设情况汇报网站建设 找 中企动力

您遇到了序列化问题.序列化是将某些数据转换为可以传输的格式的地方.有几种方法可以做到这一点,其他答案中提到了一些方法.我建议使用JSON作为您的格式.你可以从json.org获得一个很好的Java JSON库.然后你可以简单地用库创建一个JSON数组并将其写入servlet的OutputStream.publi…

Ext-js-即时入门-全-

Ext.js 即时入门(全)原文:zh.annas-archive.org/md5/319b5f78296b907ed18f869df6d30bcd 译者:飞龙 协议:CC BY-NC-SA 4.0第一章. 立即开始使用 Ext JS 欢迎使用 立即开始使用 Ext JS。这本书特别创建,旨在为你提…

Ext-js4-扩展开发指南-全-

Ext.js4 扩展开发指南(全)原文:zh.annas-archive.org/md5/a5206065e508c907085190958356327e 译者:飞龙 协议:CC BY-NC-SA 4.0前言 在这个现代的 JavaScript 世界中,Ext JS 提供了一大批跨浏览器实用工具、一个庞…

ECMAScript6-学习指南-全-

ECMAScript6 学习指南(全)原文:zh.annas-archive.org/md5/2e74de015757f2bd7f53f3ea6c57c46f 译者:飞龙 协议:CC BY-NC-SA 4.0前言 ECMAScript 是由 Ecma International 在 ECMA-262 规范和 ISO/IEC 16262 中标准…

整网站代码 带数据 免费 下载wordpress百度云直链

目录 MySQL 管理MySQL 用户管理 参考数据库管理SQ查询语句1. 导入示例数据库&#xff0c;教程 MySQL导入示例数据库2. 查询语句 SELECT3. 筛选语句 WHERE &#xff0c;过滤4. 分组语句 GROUP BY5. 排序语句 ORDER BY6. 函数作业总结MySQL 管理 MySQL版本 8.0.15 MySQL 用户管理…

iis建设个人网站中国建设银行网站分期通

文章目录 前言介绍forwardRefmemo适用场景优点缺点后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端面试 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错…

JSP征婚信息实用的系统3kx16代码+源码+数据库+调试部署+开发环境

JSP征婚信息实用的系统3kx16代码+源码+数据库+调试部署+开发环境pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…