当前位置: 首页 > article >正文

多线程的锁策略

文章目录

  • 前言
  • 一.乐观锁与悲观锁
  • 二.轻量级锁和重量锁
  • 三.自旋锁和挂起等待锁
  • 四.互斥锁和读写锁
  • 五.不可重入锁和可重入锁
  • 六.公平锁和非公平锁


前言

其实这里指的锁策略,不只只是线程才存在的。也不只是针对Java的,我现在就即将介绍常见的锁策略。

一.乐观锁与悲观锁

乐观锁:预测接下来的事情的冲突概率不大
悲观锁:预测接下来的事情冲突概率很大
这里说俩个概念,可能很抽象。但我们拿我们大学的期末考试举例子,明天要考试了,你丝毫对成绩不在乎能过就行,你的室友通宵复习,在思考接下来发生的种种事情,觉得自己会挂科,会重修,然后就焦虑焦虑焦虑,这里面充当的角色(你)是乐观锁,你的室友是悲观锁。
这里俩个锁的通常来说,悲观锁做的事情要多一点,效率低,乐观锁做的事情要少一些,效率低。

如果说没有理解到乐观锁与悲观锁的例子,那我画一个图大家理解一下
在这里插入图片描述

二.轻量级锁和重量锁

轻量级锁加锁解锁过程更高效
重量级锁,加锁解锁更慢,更低效
当然乐观锁也可能是一个轻量级锁
一个悲观锁也可能是一个重量级锁

三.自旋锁和挂起等待锁

自旋锁是轻量级锁一种经典的一个实现
挂起等待锁是重量级锁一种经典的一个实现

我先来说说什么是自旋锁
就拿我追女神来说,我舔女神,女神给我发好人卡,这就是加锁失败了。但如果我每天锲而不舍的去,向女生问候早安,午安,晚。突然有一天,女生跟他现在的男朋友分手了,此时我的机会不就来了,趁机上位。
这个情况就是,我尝试不断加锁,如果锁突然释放,我就会第一时间拿到锁.但这里有个弊端,就是我得整天围着她转,什么也干,这就是CPU的忙等。消耗资源。

什么是挂起等待锁呢?
我追女神追不到,我就先不搭理女神了,去干其他的事情,突然有一天女神想起我了,她主动来找我,那我高兴坏了,这个时候我的机会就来了。
换言之如果锁被释放,不会第一时间拿到锁,这时候等待的过程中有空闲时间,我可以干别的事情。

四.互斥锁和读写锁

怎么说呢?sychronize就是互斥锁,互斥锁只是单纯的加锁和解锁操作罢了。
读写锁才是重点
读写锁,简而言之,就是把读和写这两种加锁分开。另外他有一种特殊的场景,多线程同时对一个数据的访问和修改。

读写锁的过程:
1给读加锁
2给写加锁
3解锁
读写锁的约定:
1.读锁和解锁之间,不会存在锁竞争
2.写锁和写锁之间,有锁竞争
3.读锁和写锁之间有锁竞争
下面是一个例子:
在这里插入图片描述

五.不可重入锁和可重入锁

大概就是一个锁,在一个线程中连续加锁俩次不死锁,叫可重入锁,如果死锁了,叫不可重入锁。

这个我们还是来举一个例子
在这里插入图片描述

六.公平锁和非公平锁

此处对于公平与不公平的定义就是是不是遵循先来后到原则。
遵循的是公平锁
不遵循的是非公平锁
在这里插入图片描述


http://www.kler.cn/a/7435.html

相关文章:

  • leetcode 扫描线专题 06-leetcode.253 meeting room ii 力扣.253 会议室 II
  • 深度学习中的Pixel Shuffle和Pixel Unshuffle:图像超分辨率的秘密武器
  • 从零开始学习 sg200x 多核开发之 uboot 网络功能使能
  • w~视觉~合集23
  • Spring Boot 中 Druid 连接池与多数据源切换的方法
  • C/C++语言基础--initializer_list表达式、tuple元组、pair对组简介
  • Python 自动化指南(繁琐工作自动化)第二版:八、输入验证
  • 中间表示- 三地址码
  • 从零开始实现一个C++高性能服务器框架----环境变量模块
  • 2 新建工程步骤
  • 045:cesium加载OpenStreetMap地图
  • 第十四届蓝桥杯模拟赛(第一期)——C语言版
  • 详解如何使用Nginx搭建文件服务器及实现文件服务
  • 询问ChatGPT的高质量答案艺术——提示工程指南(更新中……)
  • 什么是服务架构?微服务架构的优势又是什么?
  • 聚会Party
  • 剪枝与重参第四课:NVIDIA的2:4剪枝方案
  • 做了个springboot接口参数解密的工具,我给它命名为万能钥匙(已上传maven中央仓库,附详细使用说明)
  • 4.5--计算机网络之基础篇--1.模型分层--(复习+深入)---好好沉淀,加油呀
  • Elasticsearch:索引状态是红色还是黄色?为什么?
  • C++ 数组与字符串详解
  • 51单片机-LED篇
  • erpnext--指令
  • 多个硬盘挂载到同一个目录
  • 重新理解一个类中的forward()和__init__()函数
  • MyBatisPlus-DML编程控制