【JavaEE初阶】深入理解不同锁的意义,synchronized的加锁过程理解以及CAS的原子性实现(面试经典题);

news2024/11/25 0:49:01

前言

🌟🌟本期讲解关于锁的相关知识了解,这里涉及到高频面试题哦~~~

🌈上期博客在这里:【JavaEE初阶】深入理解线程池的概念以及Java标准库提供的方法参数分析-CSDN博客

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

 

目录

📚️1.引言

📚️2.锁的策略

2.1乐观锁与悲观锁

2.2轻量级锁和重量级锁

2.3自旋锁和挂起等待锁

2.4普通互斥锁和读写锁

2.5公平锁和非公平锁

2.6可重入锁和不可重入锁

📚️3.synchronized的加锁过程

3.1锁升级

1.偏向锁阶段

2.轻量级锁

3.重量级锁

3.2锁消除

3.3锁粗化

📚️4.CAS的实现原理

4.1CAS的内部逻辑

4.2CAS实现线程安全

4.3CAS的原子性

📚️5.总结

📚️1.引言

    Hello!uu们小编又来啦,上期在介绍过线程池的理解后,相信大家已经对其有了更深的了解,致此多线程初阶已经完结,前面的博客也可以供大家学习,复习哟~~~

本期只要是讲解关于不同锁的不同的意义理解,例如:乐观锁和悲观锁,以及synchronized的加锁之前的操作.......那就直接开始吧!!!

📚️2.锁的策略

2.1乐观锁与悲观锁

这是锁的两种不同实现方式;

乐观锁:即加锁之前,预估在程序中的锁的冲突不大,因此在加锁的时候就不会进行太多的操作;

悲观锁: 即加锁之前,预估在程序中的锁的冲突很大,因此在加锁的时候就不会进行比较多的操作;

乐观锁的影响: 由于加锁的工作很少,所以加锁的时候就很快,但是缺点就是会造成更多的CPU资源的消耗(引入一些其他问题)

悲观锁的影响:由于加锁的时候工作比较多,所以在加锁的时候就比较满,所以此时造成的问题就很少;

2.2轻量级锁和重量级锁

轻量级锁:消耗的CPU资源多,加锁比较快=>这里理解为乐观锁;

重量级锁:消耗的CPU资源少,加锁比较慢=>这里理解为悲观锁;

这里的轻量级锁和重量级锁是加锁后对锁的一种评价,而乐观锁和悲观锁是加锁前的一种预估,这里是从两种不同的角度来描述一件事情;

2.3自旋锁和挂起等待锁

自旋锁:是轻量级锁的一种典型实现,一般搭配while循环,在加锁成功后退出循环,但是加锁不成功后,会进入循环再次尝试加锁;

挂起等待锁:是重量级锁的一种典型实现,在加锁失败后,会进入阻塞状态,直到获取到锁

自旋锁的使用:一般用于锁冲突比较小的情况,由于高速反复的尝试加锁,导致CPU的资源消耗上升,取而代之的是加锁的速度快,但是在线程多的情况下会发生“线程饿死”的问题

挂起等待锁的使用:一般用于所冲突比较大的情况,由于进入阻塞后,就是内核随机调度来进行执行,要进行的操作增加,导致加锁更慢了

synchronized锁:这里的synchronized锁具有自适应的能力的,例如在锁冲突情况比较严重的时候,这里的synchronized就是悲观锁、重量级锁、挂起等待锁.....所以这里的synchronized是根据当时的锁的冲突情况来进行自适应的~~~

2.4普通互斥锁和读写锁

普通互斥锁:即synchronized类似,只有加锁和解锁

读写锁:这里的解锁是一样的,但是在加锁的时候分为两种即“加读锁”与“加写锁”

这里的情况就是:

读锁和读锁这之间,不会出现锁的冲突

读锁和写锁这之间,会出现锁的冲突

写锁和写锁这之间,会出现锁的冲突

即一个线程加读锁的时候,另一个线程是可以“读”的,但是是不可以“写”的;

即一个现场加写锁的时候,另一个线程是不可以进行“读”和“写”的 

为什么要引入读写锁:

在线程的读的操作中,读这个操作本来就是线程安全的,但是使用synchronized任然要给这一部分要加锁,由于加锁这个操作本来就是一个低效率的操作;在读的过程中不加锁可以打打提升效率;

但是读的时候完全不加锁,可能会在读的时候进行写操作,所以这里又要加“读锁”;

2.5公平锁和非公平锁

公平锁:即等待加锁的时间越久,就应该在锁释放的时候,先加上锁(先来先到原则)

非公平死锁:即在锁释放后,获取锁的概率是一样的,存在竞争;

如下图所示:

2.6可重入锁和不可重入锁

可重入锁:即在加锁过后任然在这个线程继续进行加锁;

不可重入锁:即在加锁过后,这个线程就不能进行加锁了;

例如synchronized是一个可重入锁,但是在系统中的锁是一个不可重入锁;

可重入锁需要记录加锁的对象,以及加锁的次数;

📚️3.synchronized的加锁过程

在synchronized加锁之前会经历一下升级过程

3.1锁升级

1.偏向锁阶段

这里的偏向锁阶段的实现和之前讲解的“懒汉模式”是有一定的联系的,即非必要不加锁,但是这里的偏向锁,并不是真正意义上的加锁;

偏向锁:即一种非必要不加锁的模式,真正意义上是不加锁的,而是进行一次轻量级的标记

这里就是当没有锁进行竞争的话就会不加锁,只是轻量化标记一下,当有锁的竞争,那么这个标记的就会很快拿到锁;

偏向锁的作用: 存在锁冲突的情况下,这中锁没有提高效率,但是当没有锁的竞争后,因为只是轻量化标记,而不加锁,那么这里的效率就会得到很大的提升;

2.轻量级锁

轻量级锁:即通过自旋的方式进行实现,反复快速的进行加锁的操作

优点:在锁的释放后,能够快速的拿到并加上锁;

缺点:非常消耗CPU的资源;

这里synchronized会根据有多少个线程在参与竞争,如果比较多,那么就会升级成重量级锁;

3.重量级锁

重量级锁:即拿不到锁的线程不会进入自旋状态,而是进入阻塞状态,释放CPU资源;

最后由内核进行随机调度,从而加上锁;

3.2锁消除

锁消除:即synchronized的一种优化策略,但是比较保守;

即编译器在编译的时候优化一下两种情况:

1.不存在锁竞争,只有一个线程,那么此时就会进行锁消除

2.加锁的代码中没有涉及到成员变量的改动,只有局部变量的改动,就不需要进行加锁

3.3锁粗化

锁粗化:即讲一个细粒度的锁,转化为一个粗粒度的锁;

粒度:即在synchronized{ },这个括号里的代码越少,即粒度越细;代码越多,即粒度越粗

所谓的粒度粗化,如下图所示:

可以发现,这里频繁的加锁解锁会造成额外的时间开销,而直接一步到位可以剩下这部分的时间开销;

📚️4.CAS的实现原理

4.1CAS的内部逻辑

所谓的CAS即compare and swap,即一种比较和交换,这是一个特殊的CPU的指令

其内部伪代码:

boolean CAS(address,expectValue,swapValue){
      if(&address==expectValue){
          &address=swapValue;
          return true;
      }
      return false
}

 注意:这里是一段伪代码,不能进行运行,只是描述逻辑的,即先进行判断寄存器的值和地址值是否相等,相等就将另一个swap寄存器的值给地址值(内存地址值)

4.2CAS实现线程安全

CAS是CPU的一种指令,操作系统又对这个指令进行了封装,我们的Java又对操作系统的API进行了封装,那么我们就可以进行使用啦;

在之前我们在实现两个线程对count实现加法操作,需要进行加锁,但是有了CAS就可以不用进行加锁了;

代码如下:

public static AtomicInteger count=new AtomicInteger();
    public static void main(String[] args) throws InterruptedException {
        Thread t1=new Thread(()->{
            for (int i = 0; i <50000 ; i++) {
                count.getAndIncrement();
            }
        });
        Thread t2=new Thread(()->{
            for (int i = 0; i <50000 ; i++) {
                count.getAndIncrement();
            }
        });
        t1.start();
        t2.start();

        t1.join();
        t2.join();
        System.out.println("最终count的值为:"+count.get());
    }

这里就是通过使用原子类工具,实现了没有加锁的仍然线程安全的代码;

注意:之前的count++是三个指令,在线程的随机调度中存在不同指令的穿插的情况,导致线程安全问题,但是getandincrement本来就是一个线程安全的指令(就是一个指令),天然就具有原子性;

4.3CAS的原子性

在实现原子类的伪代码如下图所示

即起初内存中的值为value,oldvalue是寄存器中的值,进入循环,当比较成功,那么就value的值就为value+1了;

当存在随机调度的时候:

 

那么此时就会有以下操作:

第一步:执行右边线程的操作

第二步:进行随机调度走的代码

 

注意:在次比较发现内存和寄存器的值是不一样的了,此时就会进行再次读取内存,在次进行循环比较,发现一样了,就会加1跳出循环

代价:这里的代价,就是while循环造成的自旋,CPU的消耗;

📚️5.总结

💬💬本期小编讲解了关于不同锁的基本概念,包括我们经常使用synchronized的加锁过程包含的“锁升级,锁消除,锁粗化”的一系列的操作,以及CAS的实现和我们之前线程安全的代码的举例,本篇主要是涉及到(关于锁面试题)~~~

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!

 


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                             😊😊  期待你的关注~~~

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

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

相关文章

(笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第6关---OpenCompass 评测 InternLM-1.8B 实践

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频&#xff1a;https://www.bilibili.com/video/BV1RM4m1279j/ 课程文档&#xff1a; https://github.com/InternLM/Tutorial/blob/camp3/docs/L1/OpenComp…

嵌入式设备硬件和软件安全设计

1. 引言 哪个领域的网络安全实施记录最差&#xff1f; 既不是 PKI/数字证书&#xff0c;也不是 密钥管理&#xff0c;也不是 OAuth。很可能是嵌入式设备和物联网 领域。 总的来说&#xff0c;这似乎是一个梦想&#xff0c;但如果可设计出“设计安全”的系统&#xff0c;而不…

转行大模型开发,能不能挽救职业生涯?

大模型算是当之无愧最火的一个方向了&#xff0c;算是新时代的风口。有小伙伴觉得&#xff0c;既然是新领域、新方向&#xff0c;那么&#xff0c;人才需求肯定比较大&#xff0c;相应的人才缺乏&#xff0c;竞争也会更少&#xff0c;那转行去做大模型是不是一个更好的选择呢&a…

硬盘数据恢复的方法有哪几种?9种妙招速览

在当今数字化时代&#xff0c;硬盘数据的安全至关重要。然而&#xff0c;数据丢失的情况时有发生&#xff0c;掌握硬盘数据恢复方法显得尤为重要。本文将详细介绍几种有效的硬盘数据恢复方法&#xff0c;帮助用户在遇到数据丢失问题时&#xff0c;能够迅速采取措施&#xff0c;…

Visual studio2019+PCL1.11.1+win10

目录 一.软件下载1.visual studio2019下载2.PCL下载二.安装步骤1.安装PCL1.11.0步骤2.解压pcl-1.11.0-pdb-msvc2019-win64.zip3.安装OpenNI-Windows-x64-2.2.msi4. 设置环境变量5.visual studio2019配置6.双击新添加的属性表—VC++目录—包含目录,添加7个include路径7.测试代码…

幸运7游戏模拟 python

题目&#xff1a; 幸运"7"游戏,用计算机模拟掷骰子的过程&#xff0c;测算两个骰子点数之和为7的概率。 游戏规则是你丢两个骰子&#xff0c;如果其点数之和为7你就赢4元&#xff0c;不是7你就输1元。 假设你刚开始有10元&#xff0c;当全部输掉为0元的时候游戏结…

阿里云云虚拟主机SSL证书安装指南

在安装SSL证书的过程中&#xff0c;您需要确保已经正确获取了SSL证书文件&#xff0c;并且能够访问阿里云云虚拟主机的管理页面。以下是详细的步骤说明&#xff1a; 第一步&#xff1a;准备SSL证书 申请SSL证书&#xff1a;访问华测ctimall网站&#xff08;https://www.ctimal…

Cloud-Edge-Terminal Collaborative AIGC for Autonomous Driving

摘要 在动态自动驾驶环境中&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;技术可以通过利用模型的生成和预测能力来补充车辆感知和决策&#xff0c;并有可能增强运动规划&#xff0c;轨迹预测和交通模拟。本文提出了一种云-边缘-终端协同架构&#xff0c;以支持AI…

【SQL】Windows MySQL 服务查询启动停止自启动(保姆级)

MySQL是一种开放源代码的轻量级关系型数据库管理系统&#xff0c;使用最常用的结构化查询语言&#xff08;SQL&#xff09;对数据库进行管理。由于MySQL具有体积小、速度快、成本低、开放源码等优点&#xff0c;现已被广泛应用于互联网上的中小型网站中&#xff0c;并且大型网站…

sqlserver-合理化CTFP(cost threshold for parallelism)

文章目录 About CTFPCTFP 默认值的意义合理化CTFP值1.查看高使用次数的执行计划2.调整CTFP值 About CTFP CTFP (Cost Threshold for Parallelism) 是 SQL Server 中的一项配置&#xff0c;用于控制查询执行计划何时使用并行处理。具体来说&#xff0c;它表示执行计划的“子树成…

Python系统教程005(字符串的格式化输出)

知识回顾 1、默认情况下&#xff0c;input函数接收的数据是字符串类型。 2、字符串类型的关键词是str。 3、\n和\t都是转义字符&#xff0c;\n用来换行&#xff0c;\t用来留出一段固定长度的空白。 4、type函数能够用来查看变量的数据类型 5、数据类型的转换&#xff0c;举…

MySQL从0到1基础语法笔记(上)

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java Web关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 MySQL笔记&#xff1a; 一、注释&#xff1a; 二、SQL四大类&#xff…

鸿蒙开发(NEXT/API 12)【应用加密】程序访问控制

能力简介 为了保护应用代码安全&#xff0c;保护开发者的核心资产&#xff0c;HarmonyOS提供了端到端的应用代码保护机制&#xff0c;该机制以系统安全为基础&#xff0c;构建内核级应用生命周期内的代码安全保护能力。 开发者向应用市场提交上架申请&#xff0c;上传应用包后…

<Rust>iced库(0.13.1)学习之番外:如何为窗口添加初始值?

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 注:新版本已更新为0.13 概述 这是本专栏的番外篇,主要介绍一下新…

国产测径仪的发展历史

关键字:国产测径仪,进口测径仪,蓝鹏测控,测径仪厂家,测径仪品牌 国产测径仪的发展史是一段从引进技术到自主创新、从依赖进口到逐步国产替代的历程。以下是国产测径仪发展史上的几个关键阶段和里程碑&#xff1a; 起步与引进阶段 在早期&#xff0c;国内测径仪技术相对落后&a…

AI Agent现状:为何企业落地AI应用这么难

本文旨在探讨一个关键问题&#xff1a;为何在企业AI应用场景中&#xff0c;大模型应用在用户眼中显得乏善可陈&#xff0c;以至于未能激发出足够的实施意愿。简要来说&#xff0c;当前大多数文本相关应用所提供的智能增值不足&#xff0c;用户需要至少100次以96%准确率进行的LL…

虚拟化数据恢复—互斥不当导致vmfs卷损坏的数据恢复案例

虚拟化数据恢复环境&#xff1a; 某企业信息管理平台&#xff0c; 几台VMware ESX Server主机共享一台存储设备&#xff0c;大约有几十台虚拟机。 虚拟化故障&原因&#xff1a; Vcenter报告虚拟磁盘丢失。管理员通过ssh远程到ESX中执行fdisk -l命令查看磁盘&#xff0c;发…

第二十天|二叉搜索树的公共祖先,修改与构造| 235. 二叉搜索树的最近公共祖先, 701. 二叉搜索树中的插入操作,450. 删除二叉搜索树中的节点

关于二叉搜索树的题目&#xff0c;貌似普遍用迭代法比递归法简单。目前做到的除了98验证二叉搜索树都是如此。 701其实很简单&#xff0c;只是之前自己想不到直接添加到叶子节点这个方法。 注意一个问题&#xff1a;判断需要返回 root 还是 newRoot 返回 root&#xff1a;当操…

超好用的数据库连接工具-DBeaver连接ClickHouse后找不到系统表?

一、前言 公司内部禁止使用Navicat&#xff0c;又不想装JetBrains的DataGrip。找了半天找到这款完全开源的数据库连接工具&#xff0c;几乎可以连接市面上所有的数据库&#xff0c;功能非常强大 二、工具简介 对关系数据库的基本支持&#xff1a;MySQL、SQL Server、PostgreS…

双十一好物清单!这5款高端又实用的双十一好物千万别错过!

随着双十一购物狂欢节的临近&#xff0c;空气中开始弥漫着一股热烈而兴奋的购物气氛。在这个日子里&#xff0c;商品的折扣与优惠的都比较大&#xff0c;很多人都想挑选一款产品&#xff0c;但是&#xff0c;面对琳琅满目的好物&#xff0c;如何选择变成了一个难题&#xff0c;…