首页 > 编程语言 >JavaEE初阶--锁进阶理解

JavaEE初阶--锁进阶理解

时间:2024-06-03 14:33:41浏览次数:26  
标签:重入 初阶 synchronized -- JavaEE CAS vs 线程 加锁

目录

一、引言

二、锁的分类

1.乐观锁 vs 悲观锁

2.重量级锁 vs 轻量级锁

3.自旋锁 vs 挂起等待锁

4.公平锁 vs 非公平锁

5.可重入锁 vs 不可重入锁

6.读写锁

三、CAS

1.什么是CAS?

2.CAS伪代码

3.CAS的实现

4.CAS的应用

5.CAS的ABA问题

四、总结


一、引言

  前面的博客我们为了防止线程抢占式执行,我们就引入了锁这个概念,但锁的知识还存在很多,所以本篇博客就简单给大家再介绍一下锁的知识。

二、锁的分类

1.乐观锁 vs 悲观锁

  悲观锁:总是假设成最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。

  乐观锁:假设数据一般情况下不会产生并发冲突,所以在数据进行提交更新的时候,就会对数据是否产生并发冲突进行检测,如果发现了并发冲突,则让返回用户错误的信息,让用户决定如何去做。

  synchronized初始使用乐观锁策略,当发现锁竞争比较频繁的时候,就会自动切换成悲观锁策略。

2.重量级锁 vs 轻量级锁

  重量级锁:加锁机制重度依赖了OS提供的mutex,大量的内核态用户态切换,很容易引发线程的调度。

  轻量级锁:加锁机制尽可能不使用mutex,而是尽量在用户态代码完成,实在搞不定了,再使用mutex。少量的内核态用户态切换,不太容易引发线程调度。

  synchronized开始是一个轻量级锁,如果锁冲突比较严重,就会变成重量级锁。

3.自旋锁 vs 挂起等待锁

  自旋锁:线程在枪锁失败后,进入阻塞状态,放弃CPU,需要过很久才能再次被调度。如果获取锁失败,立即再尝试获得锁,无限循环,直到获得锁为止。一旦锁被其他线程释放,就能第一时间获取到锁。

  挂起等待锁:第一次获取锁失败,就一直等,过很久才去重新获取。

自旋锁是一种典型的”轻量级锁“的实现方式:

优点:没有放弃CPU,不涉及线程阻塞和调度,一旦锁被释放,就能第一时间获得锁。

缺点:如果锁被其他线程持有的时间比较久,那么就会一直持续消耗CPU(而挂起等待的时候不消耗CPU的)。

  synchronized中的轻量级锁策略大概率就是通过自旋锁实现的。

4.公平锁 vs 非公平锁

  公平锁:遵守”先来后到“。

  非公平锁:不遵守”先来后到“。

注意:操作系统内部的线程调度就可以视为是随机的,如果不做额外的限制,锁就是非公平锁,如果要实现公平锁,就需要依赖额外的数据结构,来记录线程们的先后顺序。

  synchronized是非公平锁。

5.可重入锁 vs 不可重入锁

  可重入锁:允许同一个线程多次获取同一把锁。比如一个递归函数里有枷锁操作,递归过程中这个锁会阻塞自己吗?如果不会,那么这个锁就是可重入锁(因为这个原因可重入锁也叫做递归锁)。Java里只要以Reentrant开头命名的锁都是可重入锁,而且JDK提供的所有现成Lock实现类,包括synchronized都是可重入的。

  不可重入锁:第一次加锁之后,再一次进行加锁,就会出现死锁的情况。

synchronized是可重入锁。

6.读写锁

1.两个线程都只是读一个数据,此时并没有线程安全问题,直接并发的读取即可。

2.两个线程写同一个数据,存在线程安全问题。

3.一个线程读另外一个线程写,也有线程安全问题。

  读写锁就是把读操作和写操作区分对待,Java标准库提供了ReentrantReadWriteLock类,实现了读写锁。ReentrantReadWriteLock.ReadLock类表示一个读锁,这个对象提供了lock/unlock方法进行加锁解锁。ReentrantReadWriteLock.WriteLock类表示一个写锁,这个对象也提供了lock/unlock方法进行加锁解锁。

synchronized不是读写锁。

三、CAS

1.什么是CAS?

  全称”Compare and swap“假设内存原数据V,旧的预期值A,需要修改的新值B,1.比较A与V是否相等。2.如果比较相等,将B写入V。3.返回操作是否成功。

2.CAS伪代码

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

当多个线程同时对某个资源进⾏CAS操作,只能有⼀个线程操作成功,但是并不会阻塞其他线程,其他线程只会收到操作失败的信号。CAS可以被视为一种乐观锁。

3.CAS的实现

1.Java的CAS利用的是unsafe这个类提供的CAS操作。

2.unsafe的CAS依赖的是jvm针对不同的操作系统实现的Atomic::cmpxchg

3.Atomic::cmpchg的实现使用了汇编的CAS操作,并使用cpu硬件提供的lock机制保证其原子性。

4.CAS的应用

1.实现原子类

提供了java.util.concurrent,atomic包,里面的类都是基于这种方式实现的。

AtomicInteger atomicInteger = new AtomicInteger(0);
atomicInteger.getAndIncrement();

注意:CAS是直接读写内存的,而不是操作寄存器。CAS的读内存,比较,写内存操作是一条硬件指令,是原子的。

2.实现自旋锁

5.CAS的ABA问题

存在两个线程,即当t1想把某个值改为Z时,先判断num是否为A,再改为Z,t2线程又把其从A改成B,又从B改成A。

ABA问题的解决:

给要修改的数据引入版本号,在CAS比较数据当前值和旧值的同时,也要比较版本号是否符合预期,如果发现当前版本号与之前的版本号一致,就真正执行修改操作,并让版本号自增。如果发现当前版本号比之前读到的大,就认为操作失败。

四、总结

  本篇博客简单介绍了锁的分类以及CAS锁,欢迎大家在评论区讨论,感谢大家观看!

标签:重入,初阶,synchronized,--,JavaEE,CAS,vs,线程,加锁
From: https://blog.csdn.net/m0_74815183/article/details/139392266

相关文章

  • [MQTT]服务器EMQX搭建SSL/TLS连接过程(wss://)
    目录......
  • 用docfx生成c#项目API的简洁教程
    1.下载docfx https://github.com/dotnet/docfx2.在环境变量的Path下面添加下载解压后docfx.exe的目录3.创建文档项目文件夹(名称如doc),位置最好是在解决方案文件夹,这样目录好配置,其它也方便。4.在doc文件夹运行cmd,或打开cmd,进入到doc文件夹5.运行docfxinit,然后根据提示......
  • 大数据信用报告多久查一次比较合适?如何选择查询平台?
    大数据信用在当今提及的频率比较高,同样的也越来越受重视,不少人都在积极的了解自己的大数据信用情况,那大数据信用报告多久查一次比较合适呢?接下来本文带大家从几个方面了解一下,一起去看看吧。从应用场景方面分析:一、风险自测半年一次比较好大家都知道大数......
  • DevOps后时代,构建基于价值流的平台化工程
    本文来自腾讯蓝鲸智云社区用户:CanWay平台化工程涉及双重核心意义。一方面,是类似利用IDE等工具提高工程师效率的平台化工程,如GitOps或命令行调度般便捷。然而,本文重点探讨的是基于价值流的平台化工程,尤其针对传统金融行业,关注整个协同过程的有效管理。本文重点讨论如何将CMMI(......
  • 西屋1C31164G01
    抗干扰导航定位板卡Septentrio高精度卫星定位定向2024-04-0908:28安徽一、抗干扰导航定位板卡的介绍抗干扰导航定位板卡是一种能够有效应对外部干扰的定位设备,它可以在复杂的环境中提供精准的导航和定位服务。这种板卡能够通过内部的技术,在信号受到干扰时依然保持稳定并提......
  • 西屋1C31157G03
    自动化设备常用的板卡种类有多种,包括运动控制、数据采集、图像处理、通信等,选型要点包括性能指标、接口标准、兼容性等。一、运动控制板卡运动控制板卡是自动化设备中重要的板卡之一,其主要功能是控制电动机或执行器的运动,实现设备的定位、速度控制和加速度控制。常见的运动控......
  • 淘宝店铺全自动采集私信筛选脚本【采集脚本+使用教程】
    项目原理:利用智能脚本,我们可以高效地筛选出可能不活跃的店铺,并尝试通过与其互动来判断其真实状态。通过购买并监控这些店铺的商品,我们可以有效地识别出那些未能按照平台规定及时发货的店铺,并据此向平台申请补偿。设备与资源需求:一台运行Windows10系统的电脑。完整的软......
  • 曲靖一日游
    这次去曲靖真的是给我留下了很好的印象一个是城市真的干净整洁,地上基本上没啥垃圾,搞得我都不好意思随地丢垃圾另外骑车的80%的人都戴头盔,也是搞得我不好意思不带另外这里的红绿灯挺有意思,一个是时间很长,只要碰到基本上都要等1分钟,另一个是如果红绿灯是左转直行一起的,那......
  • mac虚拟定位软件:AnyGo for Mac 免激活版下载
    AnyGo软件是一款专业的虚拟定位工具,用户可以通过该软件模拟GPS定位,实现虚拟位置的设置。该软件可以应用于多种场景,比如在社交软件中设置虚拟位置、在游戏中改变位置等。用户可以根据自己的需求选择具体的虚拟位置,并且支持一键切换真实位置和虚拟位置。AnyGo软件操作简单,......
  • 西屋板卡1A90335G26
    PCB板就是印制电路板,又称印刷电路板,是电子元器件电气连接的提供者。PCB板按照线路板层数可分为单面板、双面板、四层板、六层板以及其他多层线路板。由于印刷电路板并非一般终端产品,因此在名称的定义上略为混乱,例如:个人电脑用的母板,称为主板,而不能直接称为电路板,虽然主机板中......