锁策略介绍

news/2024/4/19 18:54:36/文章来源:https://blog.csdn.net/qq_36935038/article/details/129276810

锁策略

1、乐观锁和悲观锁

乐观锁:预测锁冲突的概率不高,多个线程下不会产生锁冲突,此时就不会真的加锁,代码中需要做的工作量比较少。

悲观锁:预测所冲突的概率很高,多线程下会产生锁冲突,代码中需要做的工作量比较大。

举例子:

小明工位上的个人电脑,如果小明认为这个电脑不会有其他同事使用,则它就不必设定开机密码,这就类似于乐观锁;

如果小明认为总有其他人用他电脑,他就会去设置一个开机密码,这样这个电脑在他在职期间只能他使用。

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

2、读写锁和互斥锁

互斥锁:多个线程竞争同一把锁时,当一个线程竞争到锁之后,其他线程就阻塞等待。比如synchronized

读写锁:分为两种加读锁和加写锁;

加读锁:多个线程同时读一份数据,不会有线程不安全问题,则没必要进行加锁;

加写锁:多个线程有读数据的,也有写数据的,会有线程不安全问题,则要进行加锁操作。

实际中读的场景更多;特点:相比于普通的互斥锁,少了很多的锁竞争。

synchronized不是读写锁,而是普通的互斥锁。

3、重量级锁和轻量级锁

轻量级锁:加锁解锁开销比较小,一般是纯用户态的加锁逻辑,开销小。少量的内核态用户态切换。

重量级锁:加锁解锁开销比较大,一般是进入内核态的加锁逻辑,开销是比较大的。会有大量的大量的内核态用户态切换。

一般来说,乐观锁也是轻量级锁,悲观锁一般也是重量级锁。注意的是:重量级锁和轻量级锁从结果来看加锁和解锁消耗的时间是多少,而乐观锁和悲观锁是从加锁的过程加锁的过程来进行区分。【并不一定】

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

4、自旋锁和挂起等待锁

线程在抢锁失败后进入阻塞状态,放弃 CPU,需要过很久才能再次被调度. 虽然当前抢锁失败,但过不了很久,锁就会被释放。没必要就放弃 CPU. 这个时候就可以使用自旋锁来处理这样的问题

自旋锁:线程第一次获取锁失败,则不断去尝试去获取这个锁,会消耗大量的CPU,反复询问锁是否就绪,所以只要锁被其他线程释放,当前线程就会第一时间获取到锁

挂起等待锁:线程第一次获取锁失败,则当前线程就进行阻塞等待,此时CPU就会空出来做其他的工作,但是当情头线程释放锁的时候,当前线程是不知道的,也就会导致当前线程获取锁可能不及时。

自旋锁是轻量级锁的一种典型实现;挂起等待所是重量级锁的一种典型实现;

自旋锁会消耗大量的CPU,挂起等待锁则适用于锁持有时间比较长的场景,可以合理利用CPU资源。

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

5、公平锁和非公平锁

公平锁:遵守 “先来后到”. 线程B 比 C 先来的. 当 A 释放锁的之后, B 就能先于 C 获取到锁.

非公平锁:不遵守 “先来后到”,当线程B和C需要加锁时候, B 和 C 都有可能获取到锁.

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

synchronized 是非公平锁

6、可重入锁和不可重入锁

可重入锁:字面意思是“可以重新进入的锁”,即允许同一个线程多次获取同一把锁,不会死锁。

不可重入锁:同一个线程针对同一把锁,连续加锁两次,会死锁。

synchronized是可重入锁。

相关面试题

  1. 你是怎么理解乐观锁和悲观锁的,具体怎么实现呢?

悲观锁认为多个线程访问同一个共享变量冲突的概率较大, 会在每次访问共享变量之前都去真正加锁.

乐观锁认为多个线程访问同一个共享变量冲突的概率不大. 并不会真的加锁, 而是直接尝试访问数据. 在访问的同时识别当前的数据是否出现访问冲突.

悲观锁的实现就是先加锁(比如借助操作系统提供的 mutex), 获取到锁再操作数据. 获取不到锁就等待.

乐观锁的实现可以引入一个版本号. 借助版本号识别出当前的数据访问是否冲突. (类似于解决CAS的ABA问题的版本号)

2、 介绍下读写锁?

读写锁就是把读操作和写操作分别进行加锁

读写锁最主要用在 “频繁读, 不频繁写” 的场景中

3、什么是自旋锁,为什么要使用自旋锁策略呢,缺点是什么?

如果获取锁失败,则马上再次测试获取锁,无限循环,知道获取锁为止。一旦锁被释放,就能第一时间获取到锁。

优点:可以第一时间获取到锁,更高效. 在锁持有时间比较短的场景下非常有用.

缺点:一直占用CPU,浪费了CPU资源。

4、synchronized 是可重入锁么?

是可重入锁

重入锁:连续加锁两次不会造成死锁

实现:在锁中记入当前线程对象,如果第二次加锁还是当前对象就直接通过,并且还要引入一个变量,每次进入一层锁,变量+1,离开一层锁变量-1,知道变量为0就真正的释放锁。

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

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

相关文章

Kubernetes12:k8s集群安全机制 ***与证书生成***

Kubernetes12:k8s集群安全机制 1、概述 1)访问一个k8s集群的时候,需要经过以下三个步骤才能完成具体操作 第一步:认证操作第二部:鉴权操作(授权)第三部:准入控制操作 2&#xff…

Java枚举详解

一.枚举 1.为什么有枚举? 如果我们的程序需要表示固定的几个值: 比如季节:spring (春),summer(夏),autumn(秋),winter(冬) 用常量表示: public static final int SEASON_SPRING 1;public st…

记一次MySQL数据迁移到SQLServer全过程

为什么要做迁移? 由于系统版本、数据库的升级,导致测试流程阻塞,为了保证数据及系统版本的一致性,我又迫切需要想用这套环境做性能测试,所以和领导、开发请示,得到批准后,便有了这次学习的机会…

idea 安装JUnit单元测试框架

JUnit是一套专门用于java的单元测试框架,主要是测试方法 junit4官方网站: JUnit – About junit5官方网站:JUnit 5 框架依赖:junit-4.12.jar;hamcrest-core-1.3.jar 安装步骤: (1&#xff…

hiveSQL开窗函数详解

hive开窗函数 文章目录hive开窗函数1. 开窗函数概述1.1 窗口函数分类1.2 窗口函数和普通聚合函数的区别2. 窗口函数的基本用法2.1 基本用法2.2 设置窗口的方法2.2.1 window_name2.2.2 partition by2.2.3 order by 子句2.2.4 rows指定窗口大小窗口框架2.3 开窗函数中加 order by…

一文吃透 Spring 中的 AOP 编程

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【C++】二叉搜索树的模拟实现

一、概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别…

开源ZYNQ AD9361软件无线电平台

(1) XC7Z020-CLG400 (2) AD9363 (3) 单发单收,工作频率400MHz-2.7GHz (4) 发射带PA,最大输出功率约20dbm (5) 接收带LNA,低…

Linux学习(9.1)文件系统的简单操作

以下内容转载自鸟哥的Linux私房菜 原文:鸟哥的 Linux 私房菜 -- Linux 磁盘与文件系统管理 (vbird.org) 磁盘与目录的容量 df:列出文件系统的整体磁盘使用量;du:评估文件系统的磁盘使用量(常用在推估目录所占容量) df du 实体…

微信小程序 《新闻列表》 案例

目录:一,步骤。要求1:主页头部的轮播图要求2:中间内容上的信息案列排版。要求3:上拉加载内容。要求4:在信息加载完成后,给用户提示二,过程中要注意的几点。1.在微信小程序中&#xf…

HNU工训中心:电子开关与信号隔离

工训中心的牛马实验 1.实验目的: 1) 认识三极管和MOS管构成三端电子开关电路; 认识信号隔离的继电器和光电隔离方式。 2) 认识施密特触发器,掌握一种波形变换方法。 3) 实现一种脉冲波形发生器。 2.实验资源 HBE硬件基础电路实验箱、示波…

第八节 构造器和this关键字、封装

构造器的作用 定义在类中的,可以用于初始化一个类的对象,并返回对象的地址。 构造器的注意事项 1.任何类定义出来,默认就自带了无参数构造器,写不写都有。 2.一旦定义了有参数构造器,那么无参数构造器就没有了&#xf…

Adversarially-Aware Robust Object Detector

目标检测作为计算机视觉的基本任务,随着深度神经网络的出现而取得了显著的进展。然而,很少有研究在各种现实场景中探索目标检测器抵抗对抗攻击的对抗鲁棒性。探测器已经受到不可察觉的扰动的极大挑战,在干净图像上的性能急剧下降,…

记录pytorch安装 windows10 64位--(可选)安装paddleseg

安装完paddlepaddle之后,就可以安装paddleseg了。一、安装Git可以参考这个网址:https://blog.csdn.net/u010348546/article/details/124280236windows下安装git和gitbash安装教程二、安装paddleseghttps://github.com/PaddlePaddle/PaddleSeg记得翻墙啊这…

Ubuntu 交叉编译工具链安装

Ubuntu 交叉编译工具链安装 1 交叉编译器安装 ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译,编译就需要编译器,我们在第三章“Linux C 编程入门”里面已经讲解了如何在 Liux 进行 C 语言开发,里面使用 GCC 编译器进行代…

试题 算法训练 JOE的矩阵

问题描述 最近JOE又在线性代数的模拟考中拿满分了,这直接导致了JOE对于计算矩阵的热情急剧下降,所以JOE希望能有这样一个程序能帮助他计算矩阵的秩。 输入格式 第一行,两个数n,m,表示矩阵是n*m的。   下面共n行,每行…

Airbnb(三) Managing Diversity in Airbnb Search 搜索多样性

abstract 搜索系统中一个长期的问题是结果多样性。从产品角度讲,给用户多种多样的选择,有助于提升用户体验及业务指标。 多样性需求和模型的目标是相矛盾的,因为传统ctr模型是 point wise,只看单个相关性不管相邻之间item差异。 …

设计模式-笔记

文章目录七大原则单例模式桥模式 bridge观察者模式 observer责任链模式 Chain of Responsibility命令模式 Command迭代器模式 Iterator中介者模式 Mediator享元模式 Flyweight Pattern组合模式 composite装饰模式 Decorator外观模式 Facade简单工厂模式工厂方法模式工厂抽象模式…

数学小课堂:无穷小(平均速度和瞬间速度的关系)

文章目录 引言I 速度1.1 平均速度1.2 瞬间速度(某一时刻特定的速度)1.3 解释飞箭是静止的悖论II 导数2.1 概念2.2 导数的现实影响2.3 微积分的意义III 无穷小3.1 贝克莱挑战牛顿(无穷小悖论)3.2 无穷小的定义引言 柯西和魏尔斯特拉斯给出的无穷小的定义: 它不是零;它的绝对…

【GUI】Robo 3T(Studio 3T Free) for Mongodb安装与使用教程

下载 robo 3T现已更名为studio 3T free,官网即可下载 studio 3T free下载地址 安装 mac电脑下载的是dmg安装包,直接正常安装即可,windows电脑也是一样的,不需要配置环境,安装即可使用。(前提是你已经安装…