关于锁策略

news2024/9/21 0:42:19

    • 常见的锁策略
      • 悲观锁
      • 乐观锁
      • 读写锁
      • 轻量级锁、重量级锁
      • 自旋锁
      • 公平锁和非公平锁
      • 可重入锁 vs 不可重入锁
      • synchronized是什么锁呢?

常见的锁策略

锁策略不仅仅限制于Java;其它锁相关的也是会涉及这些策略;这些特性主要是在实现锁的时候运用的。虽然我们的工作可能就是把轮子拼装成一辆车;不涉及造一个轮子。但是背后的原理学习还是有利于我们对知识的理解和深入;能初步的认识。

悲观锁

定义:假设在并发环境中都会发生冲突,因此在访问共享资源之前先获取锁。统统阻塞;得先获取锁。

乐观锁

定义:假设在并发环境中都不会发生冲突,因此直接进行操作,而在更新时检查是否有其他线程干扰。如果发现并发冲突了,则让返回用户错误的信息,让用户决定如何去做。

1:悲观与乐观区别?
预测锁竞争激励程度;然后背后的处理是不同的。

2:乐观锁如何检查是否有其它线程干扰呢?
乐观锁处理:是在进行操作(读或写)时不显式加锁,而是通过某种机制(如版本号、时间戳、CAS操作等)在更新时检查是否有其他线程干扰。
假设:设我们需要多线程修改 “用户账户余额”;设当前余额为 100. 引入一个版本号 version, 初始值为 1. 规定 “提交版本必须大于记录当前版本才能执行更新余额”
在这里插入图片描述

读写锁

区分读操作和写操作,允许多个线程同时读取共享资源,但只有一个线程可以进行写操作。

1:为什么能对读写锁区分呢?
一个线程对于数据的访问, 主要存在两种操作: 读数据和写数据.
两个线程都只是读一个数据, 此时并没有线程安全问题. 直接并发的读取即可.
两个线程都要写一个数据, 有线程安全问题.
一个线程读另外一个线程写, 也有线程安全问题.

2:Java 标准库提供了 ReentrantReadWriteLock 类, 实现了读写锁.
ReentrantReadWriteLock.ReadLock 类表示一个读锁. 这个对象提供了 lock / unlock 方法进行
加锁解锁.
ReentrantReadWriteLock.WriteLock 类表示一个写锁. 这个对象也提供了 lock / unlock 方法进
行加锁解锁.

3:读锁跟写锁的区别

  1. 读锁(共享锁):
    a:多线程读取时不互斥:多个线程可以同时获得读锁,同时读取共享资源,不互斥。
    b:适用于读多写少场景:在读多写少的场景中,多个线程可以同时读取共享资源,提高并发性能。
    c:阻塞写操作:当一个线程持有读锁时,其他线程若想获得写锁,就会被阻塞,直到所有的读锁都被释放。
    d:不阻塞读操作:读锁不会阻塞其他读操作,因为多个线程可以同时持有读锁。

  2. 写锁(排它锁):
    a:互斥访问:写锁是独占锁,同一时刻只允许一个线程持有写锁,用于保护对共享资源的写操作。
    b:适用于写多读少场景:在写多读少的场景中,写锁能够确保只有一个线程能够修改共享资源,保证数据的一致性。
    c:阻塞其他写操作和读操作:当一个线程持有写锁时,其他线程若想获得读锁或写锁,都会被阻塞,直到写锁被释放。
    d:不允许陈旧的读操作:写锁的引入确保在写操作时不会有其他读或写操作,防止产生陈旧的读操作结果。

轻量级锁、重量级锁

因为锁是操作系统对CPU的原子指令实现mutex 互斥锁;我们JVM 基于操作系统提供的互斥锁, 实现了 synchronized 和 ReentrantLock 等关键字和类.;但是基于mutex 进行封装;但是不限于这些工作。

轻量级锁:轻量级锁是为了在多线程竞争不激烈的情况下提高性能而设计的。不太依赖操作系统的mutex;不容易引发线程的调度;线程状态切换也是要开销的。

重量级锁:重量级锁是为了在多线程竞争激烈的情况下保证数据的正确性而设计的。重度依赖操作系统mutex;很容易引发线程的调度;线程状态切换也是要开销的。

自旋锁

按之前的方式,线程在抢锁失败后进入阻塞状态,放弃 CPU,需要过很久才能再次被调度;大部分情况下,虽然当前抢锁失败,但过不了很久,锁就会被释放。没必要就放弃 CPU. 这个时候就可以使用自旋锁来处理这样的问题。
自旋锁一种忙等的状态;如果获取锁失败, 立即再尝试获取锁, 无限循环, 直到获取到锁为止. 第一次获取锁失败, 第二次的尝试会在极短的时间内到来.;一旦锁被其他线程释放, 就能短时间获取到锁.
伪代码:
在这里插入图片描述
自旋锁是一种典型的轻量级锁的实现方式:
优点: 没有放弃 CPU, 不涉及线程阻塞和调度, 一旦锁被释放, 就能第一时间获取到锁.
缺点: 如果锁被其他线程持有的时间比较久, 那么就会持续的消耗 CPU 资源. (而挂起等待的时候是
不消耗 CPU 的)

公平锁和非公平锁

假设三个线程 A, B, C.。A 先尝试获取锁, 获取成功. 然后 B 再尝试获取锁, 获取失败, 阻塞等待; 然后
C 也尝试获取锁, C 也获取失败, 也阻塞等待.
公平锁: 遵守 “先来后到”. B 比 C 先来的. 当 A 释放锁的之后, B 就能先于 C 获取到锁.
非公平锁: 不遵守 “先来后到”. B 和 C 都有可能获取到锁.
操作系统调度上随机的;可以看做默认是非公平锁;想实现公平锁, 就需要依赖额外的数据结构, 来记录线程们的先后顺序.

可重入锁 vs 不可重入锁

可重入锁的字面意思是“可以重新进入的锁”,即允许同一个线程多次获取同一把锁。
Java里只要以Reentrant开头命名的锁都是可重入锁,而且JDK提供的所有现成的Lock实现类,包括
synchronized关键字锁都是可重入的。而 Linux 系统提供的 mutex 是不可重入锁

synchronized是什么锁呢?

synchronized是悲观锁也是乐观锁:
初始使用乐观锁策略. 当发现锁竞争比较频繁的时候, 就会自动切换成悲观锁策略.
Synchronized 不是读写锁
synchronized是轻量级锁也是重量级锁;如果锁冲突比较严重, 就会变成重量级锁。和悲观乐观锁对锁的预测程度是不同。
synchronized 是非公平锁:基于操作系统的 mutex实现
synchronized 是可重入锁:通过记录持有锁的线程身份和计数器记录加锁次数。 如果发现当前加锁
的线程就是持有锁的线程, 则直接计数自增。要所有的锁释放才能被别人获取到;即计数器为0。

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

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

相关文章

中断处理程序的延迟可能导致中断标志位仍然被置位

当中断处理程序的执行时间超过了中断事件的频率时,可能出现中断标志位仍然被置位的情况。让我们来详细解释一下这种情况。 在一个典型的系统中,中断处理程序会在中断事件发生时被触发执行。中断处理程序负责处理中断事件,并可能执行一系列操…

sjvisualizer,一个超强的Python数据可视化动画库

大家好,今天给大家介绍一个非常棒的数据可视化库,sjvisualizer。 根据时间序列数据制作动态图表,包含条形图、饼图、堆叠条形图、折线图、堆叠面积图。 可以先看一下官方的示例~ 只需几行代码,就可以制作电脑浏览器发展史的动态…

使用jmeter进行简单压力测试

前言 最近项目要上线,需要项目进行简单的压力测试,本次使用的是jmeter来进行的,由于本人不是专业测试,只是对本次使用过程进行简单的记录. 一.jemeter的下载与安装 我这个已经安装很久了,具体过程这个可以查询下其他博客(偷个懒). 二.使用过程 1.测试计划右击-添加(add)-线…

Kubernetes 创建pod的yaml文件-简单版-nginx

apiVersion: v1 #api文档版本 kind: Pod # 资源类型 Deployment,StatefulSet之类 metadata: #pod元数据 描述信息 name: nginx-demo labels: type: app #自定义标签 version: 1.0.0 # 自定义pod版本 namespace: default spec: #期望Pod按照这里的描述创建 cont…

Python类的定义和使用:什么是类?实在不知道啥叫累!

文章目录 前言1.基础概念2.定义一个 Person 类3.类定义4.类方法定义5.类的继承6.类的公有,私有7.子类调用父类的方法关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例…

“第六十五天”

固态硬盘:SSD 原理:基于闪存技术Flash Memory ,属于电可擦除ROM,即EEPROM; 由闪存翻译层和存储介质组成;闪存翻译层负责翻译逻辑块号,找到对应页,存储介质是由多个闪存芯片构成的&…

Windows中的Directory Junction和Directory symbolic link

这两者有几点显著的区别: 前者谁都可以创建,后者需要提升至管理员权限才可以创建 这两者创建的手时候都不需要Target存在

C++动态库

C动态库 动态库文件(Dynamic Link Library,DLL)是程序在运行时所需要调用的库。静态库文件是程序在编译时所需要调用的库。 1 环境介绍 VS版本:VS2017 编程语言:C 2 功能介绍 使用VS2017项目模板创建C动态库生成…

(论文阅读24/100)Visual Tracking with Fully Convolutional Networks

文献阅读笔记(sel - CNN) 简介 题目 Visual Tracking with Fully Convolutional Networks 作者 Lijun Wang, Wanli Ouyang, Xiaogang Wang, and Huchuan Lu 原文链接 http://202.118.75.4/lu/Paper/ICCV2015/iccv15_lijun.pdf 【DeepLearning】…

AMESim 2021安装教程

主要是AMESim的安装 写在前面,由于项目需要,需要自学AMESim,因此需要安装这个软件,目前仅仅安装使用,还不涉及到与MATLAB的联合仿真,老板说用 RT LAB半实物仿真平台,但是简单搜了一下&#xff0…

单链表(4)

看尾插函数 尾插函数跟头插函数唯一的不同就是找尾巴 尾插函数: 首先是动态申请一个新结点 把val放到新结点里面当新结点的data 然后在单链表里面找尾巴 比如说指针p找到尾巴了,现在将指针p指向新的结点,尾插就好了 这里的p类似于头插函…

AIX5.3安装weblogic10.3

目录 1安装IBM JDK 1.6 2图形化准备 3安装weblogic 准备 4图形化界面安装 1安装IBM JDK 1.6 1.1检查操作系统 # oslevel 5.3.0.0 # bootinfo -y (显示AIX机器硬件是64位) 64 # bootinfo -K (显示AIX系统内核是64位) 64 因此,系统需要安装64位的jdk,…

STM32C8T6实现微秒延时函数delay_us

/* USER CODE BEGIN 0 */ void delay_us(uint32_t ii) {uint32_t temp;SysTick->LOADii*8;SysTick->VAL0x00;SysTick->CTRL0x01;//2号位1使用内核时钟do{tempSysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));SysTick->CTRL0X00;SysTic…

【Unity插件】分享几个完全免费的2D角色动画生成器(推荐收藏)

文章目录 前言一、lpc-character-generator二、Universal-LPC-Spritesheet-Character-Generator三、UP主开发的2D人物换装系统四、Character Editor: Megapack完结 前言 你可能游戏开发能力很强&#xff0c;但是正愁于2D角色动画&#xff0c;那么这篇文章就是为你而准备的&…

深度学习之各种配置环境

如何使用python进行深度学习&#xff0c;我们需要配置相应的环境 第一步&#xff1a;先安装python python的官网地址&#xff1a;https://www.python.org/ 点进去&#xff0c;点击 Downloads&#xff0c;然后点击 Windows 等待下载完成&#xff0c;安装步骤请参考下文&#x…

超声波俱乐部分享:Enter AI native application

11月5日&#xff0c;2023年第十四期超声波俱乐部内部分享会在北京望京举行。本期的主题是&#xff1a;Enter AI native application。 到场的嘉宾有&#xff1a;超声波创始人杨子超&#xff0c;超声波联合创始人、和牛商业创始人刘思雨&#xff0c;蓝驰创投合伙人刘勇&#xf…

关于有源电力滤波器在地铁站低压配电系统中的应用分析

安科瑞 崔丽洁 摘要&#xff1a;作为国家提出的绿色电网、节能降耗已成为现代化企业努力的目标&#xff0c;也是企业急需解决的问题。作为地铁车站这类市政公共交通建筑的着重系统——配电系统。实现绿色电网实质上是解决电网中存在的各种电能问题&#xff0c;主要是涉及到谐波…

倍福CX9020 Windows CE6.0安装中文字库方法(附字库文件)

应用背景介绍 倍福的EPC产品有些是附带Windows CE系统的&#xff0c;例如CX9020&#xff0c;而且多数系统都是英文的&#xff0c;而且没有附带中文的字库&#xff0c;如果想要在PLC HMI中使用中文进行显示就无法实现&#xff0c;经常有工程师在电脑上编好程序和界面以后测试没…

10. GPIO中断

10. GPIO中断 回顾stm32中断系统STM32中断向量表中断向量偏移NVIC中断控制器 Cortex_A7 中断系统中断向量表GIC控制器中断IDGIC逻辑分块CP15协处理器c0寄存器c1寄存器c12寄存器c15寄存器 中断使能中断优先级设置优先级数配置 GICC_PMR抢占优先级和子优先级位数设置 GICC_BPR优先…

Linux---(五)三大工具yum、vim、gcc/g++

文章目录 一、yum工具1.Linux中安装软件的方法&#xff1a;2.什么是yum?3.yum源更新 二、Linux编辑器--vim1.IDE例子2.vim&#xff08;1&#xff09;vim的常用模式及切换模式&#xff08;2&#xff09;底层模式常用命令&#xff08;3&#xff09;插入模式常用命令&#xff08;…