JavaEE初阶多线程 (5)

1.锁的策略

1.1锁的策略是什么

这个锁的策略可以理解为,一种做法,相当于当你遇到锁竞争,加锁解锁,的情况你会怎么做。

乐观锁可以理解为疫情的时候比较乐观就买了最基本的物资, 买的时候非常方便

1.2乐观锁

当效率冲突比较低的时候就是乐观锁,这个锁就是乐观锁,资源占用率小

1.3悲观锁

当效率冲突较高的时候就是悲观锁,这个锁就是悲观锁,资源占用率高

1.4悲观锁和乐观锁的对比

 1.5轻量级锁

轻量级锁就是☞任务比较少,加锁的数量较少,可以大概理解为乐观锁

 1.6重量级锁

重量级锁就是☞任务比较多,加锁的数量比较少,可以理解为悲观锁

1.7轻量级锁和重量级锁的对比

1.8synconize锁

这个是Java包中的锁,他是比较只智能的任务少的时候就是乐观锁,任务多的时候就是悲观锁。

1.9自旋锁

一种轻量级锁的实现方式(典型)

类似于你追你女神结果女神有对象然后你一直每天骚扰,然后这时候女神分手了,这时候你就上位了,这时候就是自旋锁的感觉。

代码图片

1.10挂起等待锁

一种重量级锁的实现方式(典型)

类似于你追女神然后女神有对象,这时候你微信把女神拉黑,然后一直默默努力,然后这时候女神分手了,然后你再追求女神,这个中间空白的时间就是(挂起时间)

1.11可重入锁

synchronized就是一个可重入锁它可以一直不断的给一个对象进行加锁,不会发生死锁

1.12不可重入锁

在C++中std:mutex就是一个不可重入锁,针对一格线程加锁两次就会发生死锁。

1.13公平锁

严格按照先来后到的顺序来获取锁,哪个线程的等待时间长就是哪个线程获得锁

1.14非公平锁

各个线程各凭本事,谁拿到锁这个就是谁的。

其中synconize不是公平锁,他是系统随机调度的,要是想公平的化就要使用队列来实现线程的公平拿到锁。

1.15公平锁和非公平锁的相互功能对比

1.16互斥锁

互斥锁相当于拿到这个锁以后如果这个线程再出现一次这个锁就会报错,像synconize就是一个典型的互斥锁

1.17读写锁(JAVA api中读写锁来让我们用)

我画了一格逻辑图来让大家更好的了解到读写锁是什么东西

 2.synconize详细讲解

在上面讲了那么多的锁,我们一定好奇在java jdk包中提供的synconize是什么锁这里我就总结一下

synconize其实是一个自适应的锁

它加锁的状态是下面这一张图片

这个偏向锁相当一个标记,如果需要加锁他就会加锁,如果不需要加锁他就一直标记着知道这个线程结束。在下面的图中,升级的过程是不可逆的。未来JVM或许会出一个这样的功能

3.JVM处理锁

3.1synconize锁的优化

(synconize)在编译器中,JVM会自动来判断这个锁是否应该存在,如果需要加锁就保留不需要就直接消除。

 4.CAS流程

CAS是compare 和swap进行比较和交换的意思

这是CPU的原子命令

其中JVM把这个CPU的原子指令给封装所以我们可以用这个原子指令,来进行CAS的操作

这个不建议大家用容易出错

这里只是给大家讲解一下

我们还可以用这种封装的方法来替换运算符

其中这些被封装的方法是没有进行加锁的因为加锁的化就会占用CPU占用CPU就会使代码的效率降低。

这些方法只能在一些特定的场景下才能使用

 4.1CAS可能出现的BUG

4.1.1CAS描述BUG背景

出现BUG的场景是银行取钱,你点了好几次然后取款机的按钮卡了一下,然后由于你多点了几次所以导致你出现了多个线程,假设有两个线程。然后还有一个线程是你朋友给你打了500块。

打钱的线程我们称为t1     那两个线程称之为t1 ,t2.

这个是取钱的线程

CAS是用来判断现在的和以前的钱的数值是否一样

4.1.2CAS样例代码

(1) 这段diamond的意思是定义了一个变量是oldBalance这个是用来记录现在我们的银行卡的当前余额的

(2)其中CAS操作是用来比较和赋值的,如果balance和oldbalance是相同的说明没有其他线程对balance来进行操作,这时候就会发生扣款操作,然后扣款以后的值就会等价到balance中,然后这时候oldbalance也会进行更新,假设balance的大小是1000这时候就会变成500。

4.1.3代码发生BUG图解

这时候就会发现虽然还是1000块其实已经扣款了1000(应该扣款的金额是500但是扣款了1000)

 4.2 CAS的BUG的解决方式

4.2.1引入版本号问题来解决BUG

(1)引入一个版本号,这个版本中只能进行加或者只能减,当执行了这个操作以后这个版本号就会加一。

(2)这样就可以很好的避免CAS问题

5.Callable类解决线程耦合性的问题

5.1代码

(1)和主线程高度耦合的代码

上面的这段代码的耦合性太强了这会导致我们在未来维护项目的时候不好维护。

为了能够降低线程和线程之间的耦合程度,我们引入了callable这个来降低各个线程之间的耦合程度。 

5.2代码实例

这个有两个部分相当于是异步编程

这样就是可以很好的降低了代码的耦合度

6.多线程创建的几种方法

7.多线程的知识扩展

7.1Semaphore(信号量)

(1)信号量就是相当于计数器

7.2ReenTrantLock(可重入锁)(已经淘汰了)

在以前sychronized是没有那么好

7.3countDownLatch(拆分扫描任务)

7.4countDownLock(锁存器)

这个可以用来代替join

8.线程安全

8.1多线程下的数据结构

8.1队列保证线程的安全

ConcurrenHashMap(重点)

8.3复制来队列来保证多线程读写时的安全

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

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

相关文章

Wireshark抓包后的报文太大,如何拆分?

背景:抓包获取到一个400多兆的网络数据包.pcapng文件,使用wireshark软件可以正常打开。但需要把文件导出为.json文件,从而方便对报文内容做过滤分析。使用wireshark自带的导出功能导出后发现生成的.json文件大小为2G多,使用notepa…

Python实现定时任务的方式

大家好,在当今数字化的时代,定时任务的需求在各种应用场景中频繁出现。无论是数据的定时更新、周期性的任务执行,还是特定时间点的操作触发,Python 都为我们提供了强大而灵活的手段来实现这些定时任务。当我们深入探索 Python 的世…

【机器学习】AI大模型的探索—浅谈ChatGPT及其工作原理

📝个人主页:哈__ 期待您的关注 目录 📚介绍ChatGPT 1.1 什么是ChatGPT 1.2 ChatGPT的应用场景 💡基础概念 1. 人工智能和机器学习 1.1 人工智能(AI)简介 1.2 机器学习(ML)简…

【面结构光三维重建】0.基于openCV实现相机的标定

1.标定结果 2.相机标定原理 相机标定是计算机视觉和机器视觉领域中的重要技术,用于确定相机成像的几何关系和畸变特性,以提高成像的精度和稳定性。该技术广泛应用于三维重建、机器人视觉、自动驾驶等领域。 世界坐标系:由用户定义的三维世界坐标系,描述物体和相机在真实世…

第二十五章新增H5基础(以及视频~兼容)

1.HTML5中新增布局标签 HTML5新增了页眉&#xff0c;页脚&#xff0c;内容块等文档结构相关标签&#xff0c;可以使文档结构更加清晰明了。 1.新增的结构标签 1、<header>标签 定义文档或者文档中内容块的页眉。通常可以包含整个页面或一个内容区域的标题&#xff0c…

GEYA格亚GRT8-M多种功能时间继电器交流AC220V DC24V延时断开小巧

品牌 GEYA 型号 GRT8-M1 AC/DC12-240 产地 中国大陆 颜色分类 GRT8-M1 A220,GRT8-M1 AC/DC12-240,GRT8-M2 A220,GRT8-M2 AC/DC12-240 GRT8-M&#xff0c;多功能型&#xff0c;时间继电器&#xff1a;LED指示灯&#xff0c;触头容量大&#xff0c;电压超宽&#xff0c;阻…

2024.5.29晚训参考代码

因为本套题没有BFS例题&#xff0c;所以我先把BFS模板放着 #include<bits/stdc.h> using namespace std; int n,m;//n*m的棋盘 int dis[402][402]; bool vis[402][402]; int X[]{-2,-2,-1,-1,1,1,2,2};//偏移量的表 int Y[]{-1,1,-2,2,-2,2,-1,1};//定义一个数组&…

PDF盖骑缝章

在PDF文件上加盖骑缝章&#xff0c;您可以采取以下几种方法之一&#xff1a; 使用Adobe Acrobat&#xff1a; 打开Adobe Acrobat软件&#xff0c;加载PDF文件。在工具栏选择“工具”选项&#xff0c;找到“骑缝章”或“印章”工具。选择或上传您的骑缝章图片&#xff0c;将其放…

Dify数据库结构导出到PowerDesigner

即刻关注&#xff0c;获取更多 关注公众号 N学无止界 获取更多 Dify数据库结构导出到PowerDesigner Dify简介 Dify简介 欢迎使用 Dify Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&…

FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流

RTMP Streamer是一个安卓手机端的开源RTMP直播推流框架&#xff0c;可用于RTMP直播和RTSP直播&#xff0c;其升级版还支持SRT直播&#xff08;腾讯视频云就采用SRT协议&#xff09;。RTMP Streamer支持的视频编码包括H264、H265、AV1等等&#xff0c;支持的音频编码包括AAC、G7…

AI绘画Stable Diffusion【隐藏文字】:将艺术字隐藏在国风云雾山水图中

大家好&#xff0c;我是灵魂画师向阳 今天我们分享一下用AI绘画工具Stable Diffusion制作网上很火的隐藏文字。这里以将艺术字隐藏在国风云雾山水图为例进行讲解&#xff0c;下面我们就来看看吧。 一. 艺术字隐藏在国风云雾山水图中制作方法 【第一步】&#xff1a;制作底图…

使用Python爬取华为市场游戏类APP应用

文章目录 1. 写在前面2. 接口分析3. 爬虫开发4. 下载链接获取 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守…

uni-app实现页面通信EventChannel

uni-app实现页面通信EventChannel 之前使用了EventBus的方法实现不同页面组件之间的一个通信&#xff0c;在uni-app中&#xff0c;我们也可以使用uni-app API —— uni.navigateTo来实现页面间的通信。注&#xff1a;2.8.9 支持页面间事件通信通道。 1. 向被打开页面传送数据…

JavaScript笔记二-JavaScript基础语法

1、标识符 命名规则 第一个字符必须是一个字母、下划线&#xff08; _ &#xff09;或一个美元符号&#xff08; $ &#xff09;。其它字符可以是字母、下划线、美元符号或数字。按照惯例&#xff0c;ECMAScript 标识符采用驼峰命名法。标识符不能是关键字和保留字符。 2、字…

2022年全国职业院校技能大赛高职组“信息安全管理与评估”赛项第三阶段任务书

第三阶段竞赛项目试题 本文件为信息安全管理与评估项目竞赛-第三阶段试题。根据信息安全管理与评估项目技术文件要求&#xff0c;第三阶段为夺旗挑战CTF&#xff08;网络安全渗透&#xff09;。 本次比赛时间为180分钟。 介绍 夺旗挑战赛&#xff08;CTF&#xff09;的目标…

开发语言Java+前端框架Vue+后端框架SpringBoot开发的ADR药物不良反应监测系统源码 系统有哪些优势?

开发语言Java前端框架Vue后端框架SpringBoot开发的ADR药物不良反应监测系统源码 系统有哪些优势&#xff1f; ADR药物不良反应监测系统具有多个显著的优势&#xff0c;这些优势主要体现在以下几个方面&#xff1a; 一、提高监测效率与准确性&#xff1a; 通过自动化的数据收集…

在热力图基础上寻找所有峰值位置

文章目录 概要代码概要 理解热力图:首先,了解热力图是什么以及它代表了什么信息至关重要。热力图通常是二维的,其中每个像素的颜色表示该位置的数值大小。较亮的颜色通常表示较高的数值,而较暗的颜色表示较低的数值。 阈值处理:根据问题的要求,可能需要对热力图进行阈值处…

吴恩达2022机器学习专项课程C2W2:实验SoftMax

目录 Softmax函数1.简述2.Numpy实现softmax函数 softmax成本函数softmax应用于神经网络1.自定义数据集2.构建模型3.使用模型预测4.改良模型代码&#xff08;softmax转换输出&#xff09; Softmax函数 1.简述 在 Softmax 回归和带有 Softmax 输出的神经网络中&#xff0c;模型…

小程序如何更换营业执照

​因为商家经营业务的变更&#xff0c;尤其是之前的营业执照注销等原因&#xff0c;导致要求更换小程序主体。下面就具体介绍如何进行变更。 1. 登录mp.weixin.qq.com&#xff0c;找到设置->基本设置&#xff0c;在主体信息字段&#xff0c;点击小程序主体变更。主体变更分…

【运维项目经历|015】:Nginx Web服务性能提升与优化项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的技术性问题 问题1&#xff1a;本次项目的人员配置&#xff1f; 问题2&#xff1a;本次项目的周期&am…