码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java多线程进阶——常见的锁策略


    在这里插入图片描述

    请添加图片描述

    ⭐️前言⭐️

    🍉博客主页: 🍁【如风暖阳】🍁
    🍉精品Java专栏【JavaSE】、【备战蓝桥】、【JavaEE初阶】、【MySQL】、【数据结构】
    🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁

    🍉本文由 【如风暖阳】 原创,首发于 CSDN🙉

    🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言

    🍉博客中涉及源码及博主日常练习代码均已上传码云(gitee)、GitHub


    请添加图片描述

    📍内容导读📍

    • 🍅1.乐观锁VS悲观锁
    • 🍅2.读写锁VS普通互斥锁
    • 🍅3.重量级锁VS轻量级锁
    • 🍅4.自旋锁VS挂起等待锁
    • 🍅5.公平锁VS非公平锁
    • 🍅6.可重入锁VS不可重入锁
    • 🍅7.synchronized特性

    请添加图片描述

    🍅1.乐观锁VS悲观锁

    这是两种不同的加锁态度:

    乐观锁:预测锁冲突的概率不高,所以做的工作比较少一点(简单一点),但效率更高。

    悲观锁:预测锁冲突的概率较高,所以做的工作比较多一点(复杂一点),效率更低。

    就像我们在与人合租一间房时,A在上厕所时,就比较乐观,觉得这个时候B不会去上厕所,于是就没有锁门(乐观锁)。
    而B在上厕所时,就比较悲观,觉得这个时候A来上厕所的概率比较大,于是就上锁了(悲观锁)。

    🍅2.读写锁VS普通互斥锁

    普通互斥锁:就如同synchronized,当两个线程竞争同一把锁时,就会产生竞争

    读写锁:具有加读锁和加写锁两个操作。
    读锁和读锁之间,不会产生竞争;写锁和写锁之间会产生竞争;读锁和写锁之间也有竞争。
    在实际场景中,读的操作要比写的操作多很多,读写锁要比普通的互斥锁少了很多的锁竞争,优化了效率。

    🍅3.重量级锁VS轻量级锁

    重量级锁:加锁解锁开销比较大(涉及到进入内核态的加锁逻辑,开销比较大)

    轻量级锁:加锁解锁开销比较小(纯用户态的加锁逻辑,开销比较小)

    乐观锁/悲观锁是站在加锁/解锁的过程中干的工作的多少看待的。
    而重量级锁/轻量级锁是站在加锁/解锁消耗的时间多少看待的。

    在通常情况下,干的工作多,消耗的时间也多,因此,一般乐观锁也比较轻量。悲观锁,一般比较重量。

    🍅4.自旋锁VS挂起等待锁

    自旋锁:在获取锁失败以后,不会立刻释放CPU,而是不断的询问锁的持有状态,一旦锁被释放,就能立刻获取到锁,是轻量级锁的一种典型表现。(自旋就类似于在定时器一篇文章中出现的忙等,消耗了大量CPU,反复询问当前锁是否就绪)

    挂起等待锁:在获取锁失败以后,对应的线程就会在内核中挂起等待(放弃CPU,进入等待队列),在锁被释放后由操作系统唤醒,是重量级锁的一种典型实现。

    🍅5.公平锁VS非公平锁

    公平锁:遵循先来后到的规则,在多个线程等待同一把锁时,谁先来尝试拿锁,那这把锁就是谁的。

    非公平锁:遵循随机的规则,在多个线程等待同一把锁时,锁如果释放,每个线程获取到锁的概率是相同的。

    🍅6.可重入锁VS不可重入锁

    一个线程连续加锁两次,不会造成死锁,就是可重入锁;
    反之,如果造成死锁,就是不可重入锁。

    🍅7.synchronized特性

    对于synchronized:

    1.既是乐观锁,也是悲观锁
    2.既是轻量级锁,也是重量级锁
    3.乐观锁的部分是基于自旋锁实现的,悲观锁的部分是基于挂起等待锁实现的

    (synchronized是自适应锁,在初始使用的时候,是乐观锁/轻量级锁/自旋锁,如果锁竞争变的激烈了,synchronized会自动升级成悲观锁/重量级锁/挂起等待锁)

    4.不是读写锁,是普通互斥锁
    5.是非公平锁
    6.是可重入锁


    ⭐️最后的话⭐️
    总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁

    请添加图片描述

  • 相关阅读:
    复习单片机:8*8点阵--->点亮第一个点(内含:1LED 点阵介绍+2 硬件设计+3 软件设计+4.原始代码+5 实验现象)
    An动画基础之元件的影片剪辑效果
    Fiddler模拟弱网环境测试
    该微信用户未开启“公众号安全助手”的消息接收功能,请先开启后再绑定,Java微信公众号开发消息推送公众号&用户绑定问题 的解决办法
    设计模式 外观模式解决疫情卖菜问题
    【Vue】插件的定义和使用
    Jimmer: 一个面向Java和Kotlin的革命性ORM
    【KingFusion】如何在3D场景实现流水效果
    chrome Driver 使用教程
    深入解析Laravel框架:目录结构全解析
  • 原文地址:https://blog.csdn.net/qq_60856948/article/details/127118365
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号