理解Java中锁的应用

一、死锁

1.1 定义:

当线程 A 持有独占锁a,并尝试去获取独占锁 b 的同时,线程 B 持有独占锁 b,并尝试获取独占锁 a 的情况下,就会发生 AB 两个线程由于互相持有对方需要的锁,而发生的阻塞现象,我们称为死锁。

1.2 死锁产生的条件:

  • 互斥条件:进程对所分配到的资源具有排他性,即一个资源只能被一个进程占用,直到被该进程释放
  • 请求和保持条件:一个进程因请求被占用资源而发生阻塞时,对已获得的资源保持不放
  • 不剥夺条件:任何一个资源在没有被该进程释放之前,对已获得的资源保持不放
  • 循环等待条件:当发生死锁时,所等待的进程必定会形成一个环路,造成永久阻塞

1.3 如何防止死锁:

  • 尽量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。
  • 尽量使用 Java. util. concurrent 并发类代替自己手写锁。
  • 尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。
  • 尽量减少同步的代码块。
  • 死锁检测:每当一个线程获得了锁,会在线程和锁相关的数据结构中(map、graph)将其记下。每当线程请求锁,也需要记录在这个数据结构中。针对不能实现按序加锁并且锁超时不可行的场景

二、ReentrantLock

2.1 synchronized 和 Lock的区别(如ReentrantLock)

  • synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。
  • synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁和释放锁,如果使用不当没有 unLock()去释放锁就会造成死锁。
  • 通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。

2.2 特点

可重入性:若一个程序或子程序可以“安全的被并行执行(Parallel computing)”,则称其为可重入(reentrant或re-entrant)的。即当该子程序正在运行时,可以再次进入并执行它(并行执行时,个别的执行结果,都符合设计时的预期)。
线程可以重复获取同一把锁

三、数据库锁

在这里插入图片描述
行锁:基于索引加载,锁一行或多行,锁定时其他事务无法访问。缺点:可能会造成死锁
表锁:全表扫描,锁定时其他事务不能对表进行访问
记录锁:锁表中的某一条数据,命中索引为唯一索引
间隙锁:锁定一个区间,查询条件命中索引,并且没有查询到符合条件的记录,此时就会将查询条件中的范围数据进行锁定(即使是范围库中不存在的数据也会被锁定)。只适用于可重复读的事务隔离级别
临界锁:查询条件命中索引,并且查询到符合条件的记录。临键锁锁定区间和查询范围后匹配值很重要,如果后匹配值存在,则只锁定查询区间,否则锁定查询区间和后匹配值与它的下一个值的区间。(原因:当我们的索引树上只有1、5、7时,我们查询1-8,这个时候由于树节点关键字中并没有8,所以就把8到正无穷的区间范围都给锁定了;如果我们数据库中id有1、5、7、10,此时我们再模糊匹配id为1~8的时候,由于关键字中并没有8,所以找比8大的,也就找到了10,根据左开右闭原则,此时10也是被锁定的,但是id为11的记录还是可以正常进行插入的。)

四、分布式锁

4.1 分布式锁的作用

  • 避免不同节点重复工作
  • 避免多节点同时操作同一资源,导致结果不一致

4.2 分布式锁的特点

  • 互斥性:和我们本地锁一样互斥性是最基本,但是分布式锁需要保证在不同节点的不同线程的互斥。
  • 可重入性:同一个节点上的同一个线程如果获取了锁之后那么也可以再次获取这个锁。
  • 锁超时:和本地锁一样支持锁超时,防止死锁。
    高效,高可用:加锁和解锁需要高效,同时也需要保证高可用防止分布式锁失效,可以增加降级。
  • 支持阻塞和非阻塞:和ReentrantLock一样支持lock和trylock以及tryLock(long timeOut)。
  • 支持公平锁和非公平锁(可选):公平锁的意思是按照请求加锁的顺序获得锁,非公平锁就相反是无序的。

4.3 常见的分布式锁

  • MySql
  • Zk
  • Redis
  • 自研分布式锁:如谷歌的Chubby

redis分布式锁:

// 设置过期时间,并对资源加锁
// Redis2.8之后支持nx和ex是原子操作,之前需要使用lua脚本
 set resourceName value ex 5 nx

Redisson:为Redis的客户端,整合了分布式锁功能。实现像操作本地锁一样操作Redis的分布式锁。
RedLock:大多数集群加锁成功。避免Redis宕机,一个节点获取锁后,第二个节点获取同一把锁的问题。
在这里插入图片描述

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

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

相关文章

雄雄的小课堂微信机器人流程图

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 最近改造了下微信机器人,新版本还未上线,预计下周一(12.25)左右能上线第一版。 下面是改造之后的流程图 大家可以看看,有疑问可…

【计算机视觉中的多视图几何系列】深入浅出理解针孔相机模型

温故而知新,可以为师矣! 一、参考资料 《计算机视觉中的多视图几何-第五章》-Richard Hartley, Andrew Zisserman. 二、针孔模型相关介绍 1. 重要概念 1.1 投影中心/摄像机中心/光心 投影中心称为摄像机中心,也称为光心。投影中心位于一…

Ubuntu及Docker 安装rabbitmq

安装ubuntu 前 先暴露端口: 5672 用于与mq服务器通信用 15672 管理界面使用的端口 docker命令:docker run -itd --name ubuntu -p 5672:5672 -p 15672:15672 ubuntu 进入docker : docker exec -it ubuntu /bin/bash 步骤: 1. 更新安装源…

算法学习系列(九):离散化

目录 引言一、离散化概念二、离散化模板三、例题四、测试 引言 这个离散化我的理解就是你如果要用到数组的下标进行存数,会有多个询问针对下标进行操作,然后这个下标特别的大,而且存的数也是特别的分散,举个例子就是有三个数&…

VScode 工作区配置 和 用户配置

一、工作区配置 通常不同的项目都有不同的配置,我一般都是使用eslint和prettier一起用,所以经常会有这几个文件: 这里简单介绍一下这几个文件的作用吧。 1.vscode文件夹下 一般有两个文件,extensions.json和settings.json。 e…

07 Vue3中的三元表达式

概述 三元表达式时JavaScript中比较常用的一种原生语法,能够在一行代码中实现if-else的分支逻辑。 在Vue的双大括号中,我们也可以使用三元表达式去实现一些简单的条件渲染。 基本用法 我们创建src/components/Demo07.vue,先尝试一下三元表…

【泛型中K T V E? Object等分别代表什么含 义】

✅ 泛型中K T V E? Object等分别代表什么含义 ✅ 典型解析✅代码示例 ✅ 典型解析 E - Element (在集合中使用,因为集合中存放的是元素) T-Type (Java 类) K- Key (键) V - Value (值) N - Number (数值类型) ? - 表示不确定的iava类型 (无限制通配符类型) …

linux 中 C++的环境搭建以及测试工具的简单介绍

文章目录 makefleCMakegdb调试 与 coredumpValgrind 内存检测gtest 单元测试 makefile 介绍 安装 : sudo apt install make makefile 的规则: 举例说明 包括:目标文件 、 依赖文件 、 生成规则 使用 : make make clean CMake : CMake是一个…

OpenHarmony 4.0 Release发布,同步升级API 10

不久之前,OpenHarmony 正式发布了4.0 版本,开发套件也同步升级到 API 10。相比 3.2 Release 版本,4.0 版本新增 4000 多个 ArkTS API,应用开发能力更加丰富;HDF 新增 200 多个 HDI 接口,硬件适配更加便捷&a…

浅谈在线监测系统与配电能效平台在供水水厂的应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201800 【摘要】针对自来水厂工艺老化资金有限的问题,设计水厂在线监测系统,采用安科瑞,对原水滤后水、出厂水进行采样分析,并通过基于组态的上位机系统实现水质数据的实时监测。该系统…

听GPT 讲Rust源代码--src/tools(23)

File: rust/src/tools/clippy/rustc_tools_util/src/lib.rs 在Rust源代码中,rust/src/tools/clippy/rustc_tools_util/src/lib.rs文件的作用是为Clippy提供了一些实用工具和辅助函数。 该文件中定义了VersionInfo结构体,它有三个字段,分别为m…

opencv入门到精通——图像上的算术运算

目录 目标 图像加法 图像融合 按位运算 目标 学习图像的几种算术运算,例如加法,减法,按位运算等。 您将学习以下功能:cv.add,cv.addWeighted等。 图像加法 您可以通过OpenCV函数cv.add()或仅通过numpy操作res …

账号多、用户咨询量大无法及时回复?「互动管理」助力高效经营!

随着互联网行业不断向纵深发展,内容形态与营销场景也更加多元化。越来越多的品牌跑步入场,深耕社媒营销,建立多平台营销矩阵,借助社媒平台的全域态势助力品牌增长。 据云略《2023品牌新媒体矩阵营销洞察报告》显示,目前…

win11下配置visual studio 2022+PCL1.13.1

第一部分:visual studio2022 安装 vs官网网址如下:https://visualstudio.microsoft.com/zh-hans/vs/ 第一步:我们打开官网链接,按如下操作点击下载免费版本的exe文件 第二步:打开下载目录下的安装文件进行安装&#…

选择移动订货系统源码的四大原因

移动订货系统需要选择源码支持的厂家,有以下四个原因,其中第四个是比较重要的,大家点个关注点个赞,我们接着往下看。 1.可自行定制:支持源码的移动订货系统可以根据企业的具体需求进行定制开发,满足企业特定…

vue3 登录页和路由表开发

目录 应用场景/背景描述: 开发流程: 详细开发流程: 总结/分析: 背景描述 在上一篇的基础上开始开发,element-plusvue3 上一篇说道详细迁移的过程,如下: 所以我这篇开始了第一步&#xff0c…

Ubuntu20.04.2 Mate 安装后基本初始设置要点笔记

序言: 有几款Linux比较稳定而且LTS长期支持,窗口也比较干净有特色,CentOS、Ubuntu、Debian、Mint 都是挺不错的OS,因为LTS,所以不像Rolling版那样改动频发,为长期应用提供了比较好的保障。下面是 Ubuntu20…

【Filament】绘制立方体

1 前言 本文主要介绍使用 Filament 绘制彩色立方体,读者如果对 Filament 不太熟悉,请回顾以下内容。 Filament环境搭建绘制三角形绘制矩形绘制圆形 2 绘制立方体 本文项目结构如下,完整代码资源 → Filament绘制立方体。 2.1 自定义基类 为…

【计算机系统结构实验】实验5 多核编程(OpenMP编程)

5.1 实验目的 加深对多核处理器架构的理解; 掌握使用OpenMP进行多线程编程的基本方法; 学习Windows和OpenEuler环境下多核编程的过程和time命令; 5.2 实验平台 需要多核处理器的计算机和微软编程工具Visual Studio 2012。Taishan服务器&…

Mac使用Vmware Fusion虚拟机配置静态ip地址

一、设置虚拟机的网络为NAT 二、修改虚拟机的网络适配器网络 1、查看虚拟机的网卡 cd /etc/sysconfig/network-scripts#有些系统显示的是ens33,ens160等等 #不同的系统和版本,都会有所不同 #Centos8中默认是ens160,在RedHat/Centos7则为ens33 2、查看网…