一些有关多线程的‘‘八股文‘‘?!

news/2024/5/18 3:18:54/文章来源:https://blog.csdn.net/m0_63501066/article/details/127211802

目录

一. 常见的锁策略:

二. CAS

三.synchronized原理

四. HashTable, HashMap, ConcurrentHashMap 之间的区别:

五. 死锁的成因, 和解决方案:


一. 常见的锁策略:

    1.乐观锁 vs 悲观锁:
        描述的是两种不同的加锁态度
            乐观:预测锁冲突概率不高,因此做的工作简单一点
            悲观:---------------------较高,------------------复杂一点
    2.读写锁 vs 普通互斥锁:
        普通互斥锁:如同synchronized 当两个线程竞争一把锁,会产生等待
        读写锁:
            加读锁: 多个线程同时读一个变量, 不必加锁
            加写锁
            读锁,无竞争,  写写,有竞争,  读写,有竞争
        读写锁比普通互斥锁少了很多锁竞争,优化了效率
    3.重量级锁 vs 轻量级锁:
        轻量级锁 :  加锁解锁开销小, 存用户态加锁逻辑,开销小
        重量级锁 :  ------------------大, 进入内核态-----------,开销大
    4.自旋锁 vs 挂起等待锁:
        自旋锁: 轻量级锁的一种典型实现,  反复询问当前锁是否就绪  (有一种反复问哥哥能带我打游戏嘛??-哥哥烦死了说不打)
        挂起等待锁: 重量级锁
    5.公平锁 vs 非公平锁
        操作系统默认的锁的调度, 是非公平锁
        想要实现公平锁, 需要引入额外的数据结构,要额外的开销
    6.可重入锁 vs 不可重入锁
        可重入锁: 同一个线程针对同一把锁, 连续加锁两次, 不会死锁
        不可重入锁: -------------------------, --会死锁


    synchronized的对号入座~
            1.既是乐观锁, 也是悲观锁
            2. --轻量级,--重量级
            3.乐观锁的部分是基于自旋锁实现的,悲观是挂起等待
        synchronized是自适应!
            初使用, 乐观/轻量/自旋,  锁竞争不激烈.上述状态不变
            锁竞争激烈.悲/重/挂
   

二. CAS


    1.简单介绍:
        compare and swap 比较并交换
            寄存器A的值和内存M的值 进行比较,不相同,啥也不干; 相同, 把B的值和M的值进行交换(不关心B的值)
            这是由CPU一条指令,原子完成的->安全&&高效
    2.常用的两个场景:
        1.实现原子类
        2.实现自旋锁
    3.CAS 与 ABA 问题:
        如何解决ABA带来的问题?
            只要有一个记录,能够记录上内存中数据的变化,就可以解决ABA问题
                如何记录? 另外搞一个内存, 保存M的 ''修改次数''(版本号)[只增不减] 或者是 ''上次修改时间'' [只增不减]
                此时修改操作就是比较 版本号/上次修改时间了

三.synchronized原理


    一. 锁升级 / 锁膨胀
            1.偏向锁
                无竞争--类似懒汉模式~必要的时候在加锁,能不加就不加
            2.轻量级锁
                有竞争
            3.重量级锁
                竞争激烈
    二. 锁消除
        JVM自动判定,发现这个地方的代码, 不必加锁, 如果你写了synchronized 就会自动的把锁去掉
            锁消除只是在编译器/JVM有十足的把握的时候才进行的
    三. 锁粗化
        锁的粒度~ synchronized对应代码块包含多少代码,包含代码少,粒度细,包含代码多,粒度粗
            锁粗化,就是把细粒度的加锁  -> 粗粒度的加锁
        锁粒度也不是越粗就越好, 太粗不利于多线程并发,有悖用多线程初衷

四. HashTable, HashMap, ConcurrentHashMap 之间的区别:

    1.HashMap不安全,HashTable, ConcurrentHashMap安全
    2.Hashtable 多线程不推荐-无脑加锁-还只加一把-锁冲突很严重
    3.ConcurrentHashMap 多线程时请无脑使用这个~
        ~解释一下 它进行了优化 :  
        1).锁粒度的控制
            每个哈希桶都有自己的锁, 降低锁冲突概率
        2).只给写操作加锁, 读操作不加锁
            设计巧妙,不会读到修改到一半的数据 旧的/新的
        3).充分利用CAS特性
            少加锁
        4).对于扩容操作,进行特殊优化
            新的存储数据的数组不会一次把旧数组里的所有数据都拿过去,一次搞一点
            有点像-写寒假作业-一天写一点,和一支笔一盏灯一个奇迹~
        优化核心思路:
            尽一切可能, 降低锁冲突的概率


五. 死锁的成因, 和解决方案:

1.必要条件:
    1).互斥使用:
        锁1被线程1占用,线程2不能用 -- 我上厕所呢~你不能进来上厕所
    2).不可抢占:
        锁1被线程1占用, 线程2不能抢, 除非线程1主动释放--你不能强行打开我上厕所的门! 除非我出来
    3).请求和保持:
        线程1拿到锁1之后, 还要锁2 -- 一个房间两个厕所,我把第一个厕所锁上了,然后还要锁第二个厕所...
    4).循环等待:
        线程1等线程2放锁, 2等3, 3等1--漂亮,死循环~

  2.解决:
    1).2). 是锁特性 改不了
    3). 看代码,但是普适性不高
    4). 可以~
        i). 约定好加锁的顺序,打破循环等待  ---比如给锁编号,加多把锁,必须先加编号小的
        ii).银行家算法

可可爱爱,奇奇怪怪,哦,今天又是努力的一天哎~~~

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

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

相关文章

2022年NPDP新版教材知识集锦--【第一章节】(2)

【制定战略的工具】 SWOT分析:由四个英文单词的首字母组合而成,分别是优势(Strengths)、劣势(Weaknesses)、机会(Opportunities)和威胁(Threats)。 ⚫优势:某企业或项目优于其他企业或项目的特点。 ⚫劣势:某企业或项目不如其他…

python学习笔记:numpy库,使用matpotlib库绘图

目录 一.Numpy库 1.什么是numpy? 2.Numpy数组和原生Python array数组之间的区别 3.Numpy数组 ​编辑 4.numpy数组的运算 5.numpy的索引,切片 二.matplotlib 1.绘制直线 2.绘制曲线 3.散点图绘制 4.多界面绘制 5.柱形图绘制 6.3D图形绘制 一.Numpy库 1.…

数据库与MPP数仓(三十):pigsty部署

pigsty是pg的开箱即用版本,提供完善监控和高可用功能,高质量的国产开源工程,监控面板非常详尽,保姆级别的文档; 参考:腾讯云VPC部署 | Pigsty 参考:Releases Vonng/pigsty GitHub pigsty源码基本上都是使用ansible的playbook编写,使用ansible同时配置多台机器,在角…

基于Ubuntu20.04安装Nvidia驱动、Cuda和CudNN

基于Ubuntu20.04安装Nvidia驱动、Cuda和CudNN 前言 nvidia驱动,cuda,cudnn三者关系 1 nvidia驱动 1.1 nvidia驱动安装 首先Nvidia驱动应该是最好理解的,它就是GPU显卡的软件驱动程序,和计算机其他的硬件驱动一样。Nvidia官网提…

设计管理工具的三个基本类别

什么是用于管理设计过程的优质设计管理工具?成功管理设计项目需要正确的工具和软件。设计管理工具的三个基本类别是:通讯工具、时间线管理工具、文件和资源管理工具。 1、通讯工具 沟通工具使团队成员能够保持在同一页面上,无论他们的工作地点如何。他们…

app自动化测试之Andriod WebView如何测试

Hybrid App(混合模式移动应用)是介于 Web-app、Native-app 之间的 app,本质上是 Native-app 中嵌入 WebView 组件,在 WebView 组件里可以访问 Web App。Hybrid App 在给用户良好交互体验的同时,还具备了 Web App 的跨平…

在RTL书写中如何考虑延迟,面积等

在RTL书写中如何考虑延迟,面积等 文章目录在RTL书写中如何考虑延迟,面积等reference在RTL编码中考虑时延对多if语句:对单if语句case和if嵌套“先加后选”和“先选后加”调整计算顺序在RTL编码中考虑面积操作符优化资源共享多比特逻辑优化在RT…

查找

查找 查找元素伪代码 穷举法 BeginSet num[length] to some numberSet targetSet i to 0read targetwhile (i <length) doif(num[i] == target)printf("找到了")breakif(i==length)printf("没找到") 二分法 BeginSet num[length] to some numberSet tar…

毕业设计 单片机stm32的工厂环境检测系统 - 嵌入式 物联网 单片机

文章目录0 前言1 简介2 主要器件3 实现效果4 设计原理4.1 BH1750光照模块4.2 RC5224.3 DHT11温湿度传感器4.4 MQ-2烟雾传感器5 部分核心代码5 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0…

艾美捷D3204 2‘-脱氧胸苷(胸苷)中文说明书

艾美捷D3204 2-脱氧胸苷&#xff08;胸苷&#xff09;同义词&#xff1a; 胸苷; dT; 1-(2-脱氧-b-呋喃核糖基)-5-甲基尿嘧啶&#xff1b;1-(2-脱氧-bD-呋喃核糖基)-5-甲基尿嘧啶&#xff1b;2-脱氧-D-胸苷&#xff1b;b-胸苷&#xff1b;D-胸苷&#xff1b;胸腺嘧啶脱氧核苷&a…

【Django框架】——04 创建Django项目子应用

文章目录创建Django项目子应用1.创建⼦应⽤2.⼦应⽤⽬录说明3.注册安装⼦应⽤4.设置PyCharm的环境创建Django项目子应用 在Web应⽤中&#xff0c;通常有⼀些业务功能模块是在不同的项⽬中都可以复⽤的&#xff0c;故在开发中通常将⼯程项⽬拆分为不同的⼦功能模块&#xff0c;…

本地存储(localStorage和sessionStorage)

session 一段时间 local 本地的&#xff1b;当地的 1、 生命周期永久生效&#xff0c;除非手动删除&#xff0c;否则关闭页面也会存在 2、可以多窗口&#xff08;页面&#xff09;共享&#xff08;同一浏览器可以共享&#xff09; 3、以键值对的形式存…

300以内的蓝牙耳机哪款好?半入耳蓝牙耳机南卡和漫步者测评

近几年&#xff0c;真无线蓝牙耳机逐渐取代有线耳机成为更受欢迎的数码产品。相较于现如今多种多样的佩戴方式&#xff0c;传统的半入耳式一直是我的心头好。因为半入耳式的蓝牙耳机佩戴会更舒适&#xff0c;不会对耳道有明显压迫感&#xff0c;戴久了也不会闷耳。前几天看到有…

探讨布尔运算的规律

探讨布尔运算的规律 本文探讨的布尔运算仅限AND与&#xff0c;OR或&#xff0c;XOR异或三种。本文探讨的运算规律仅限交换律&#xff0c;结合律&#xff0c;分配律三种。其中分配律会依据不同的运算组合展开。 1. 定义 AND与。a AND b&#xff0c;当且仅当 a true 并且 b …

【解决redis.exceptions.ResponseError】

成功解决redis.exceptions.ResponseError: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writ…

1008序列数据

现实生活中很多数据都是有时序结构的&#xff0c;比如电影的评分&#xff08;既不是固定的也不是随机的&#xff0c;会随着时间的变化而变化&#xff09;在统计学中&#xff0c;对超出已知观测范围进行预测称为外推法&#xff08;extrapolation&#xff09;&#xff0c;在现有的…

1、4表格细线边框合并

提示&#xff1a;文章写完后&#xff0c;我们学到了边框的细线合并11不等于2。 1、语法&#xff1a; table&#xff0c; thead&#xff0c; tr&#xff0c; th&#xff0c; td{ border-collapse&#xff1a;“collapse”&#xff1b; } 解释&#xff1a; border-collapse属性控…

要提高项目参与度,项目经理应该问团队7个问题

团队协作对整个项目管理的重要性不言而喻。而随着混合和远程工作模式成的出现&#xff0c;让每个人都参与进来并保持一致需要集中精力确保团队保持一致和有效。 因此&#xff0c;为了更好带领团队、提高项目参与度&#xff0c;项目经理应该问团队以下7个问题&#xff1a;以项目…

【OpenGL】创建线段和多边形

文章目录安装nupengl程序包创建基本窗体创建线段创建多边形完整程序安装nupengl程序包 在上一节中&#xff0c;已经说明白怎么安装nupengl程序包了&#xff0c;不会的可以去翻一下。 安装nupengl程序包 后面每次我们新建项目的话都需要重新安装程序包&#xff0c;程序包是跟…

工作几年,涨薪3K遭拒,后一天我就裸辞走了···

19年7月大学毕业&#xff0c;学的计算机科学专业。因为考研之后&#xff0c;秋招结束了。没什么更多的岗位选择&#xff0c;就想找个工作先干着&#xff0c;然后亲戚在一家大厂公司上班说要招测试&#xff0c;所以就来做测试了。 虽然都是属于计算机大类&#xff0c;但自己专业…