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

JavaEE 09 锁策略

1.锁策略

1.1 乐观锁与悲观锁

其实前三个锁是同一种锁,只是站在不同的角度上去进行描述,此处的乐观与悲观其实是指在预测的角度上看会发生锁竞争的概率大小,概率大的则是悲观锁,概率小的则是乐观锁

乐观锁在加锁的时候就会做较少的事情,加锁的速度较快,但是消耗的cpu资源等也会增加,悲观锁在加锁的时候就会做很多事情来避免锁的冲突,从而加锁的时候做的事情就比较多,加锁的开销相对较小

1.2 轻量级锁与重量级锁

这里是从加锁的量级出发,本质上是和上面的悲观锁和乐观锁的意思差不多,意思是从结果的角度上看,轻量级的锁加锁开销小,重量级的锁加锁开销比较大

1.3 自旋锁与挂起等待锁

自旋锁是轻量级锁和乐观锁的一种典型实现方式,挂起等待锁是重量级锁的一种典型实现方式,自旋锁就是有一个while循环来一直判断是否需要加锁,加上锁了就跳出循环,加锁不成功就继续判断而不是阻塞,这就导致了一直消耗了系统的资源而没有做实事,所以说消耗了相对多的cpu资源

挂起等待锁则与他截然相反,挂起等待锁就需要内核调度器去参与操作了,所以要做的事情也就多了,所以需要获取到锁的时间也就多了

1.4 普通互斥锁与读写锁

普通互斥锁类似于Synchronized,有加锁和解锁两个动作

读写锁则是两种锁

读锁和读锁之间不会有锁冲突

写锁和读锁之间会有锁冲突

写锁之间也会有锁冲突

总结:一个线程加读锁的时候,另一个线程只能读不能写

一个线程加写锁的时候,另一个线程不能写也不能读

这个要和MySQL中事务的隔离级别要分得开

MySQL中的脏读,不可重复读,幻读

我们以一个有一条数据的表为例,age=10

脏读:事务A修改age =20,没有提交事务,事务B读取到这条数据之后,事务A回滚了,此时B就读到了一条脏的数据

不可重复读:事务B读取到了age=10,此时事务A修改数据为20并提交事务,事务B又一次查询数据,查到的两条数据是不一样的,这就是不可重复读

幻读:事务B查询到一条数据,此时事务A又增加一条数据,此时事务B再次查询就是两条数据,这就称为幻读

不可重复读和脏读之间的区别是:不可重复读读取的事务是已经提交的

1.5 公平锁与非公平锁

与之前介绍的线程饿死有一定的联系

这里的公平指的是先到先得,只要线程释放锁,第一个等待的线程可以率先拿到锁,就不会出现持有锁,释放锁,这样的循环持有的状态,导致其他线程没办法做事情

这就需要引入一个数据结构来实现先到先得这种特点

java原生的锁其实就是非公平锁,靠抢占式执行.

1.6 可重入锁与不可重入锁

我们之前说过,Synchronized就是一个可重入锁,就是针对一个线程,不断用这个锁加锁很多次,可重入锁不会出现问题,因为可重入锁只是增加了计数器,实际上仍然是只加了一层锁结构,而可重入锁就可能出现死锁的情况

2.Synchronized的锁优化策略

我们都说Synchronized有自适应的效果,能够根据锁冲突状态确定自己是什么类型的锁,那么到底是怎么回事呢??咱们慢慢说

Synchronized锁其实有三种状态,根据情况来逐级递增,注意这里的锁级别是不可降级的

1.偏向锁状态(假设没线程来竞争锁)

这里的核心思想就是懒汉模式的思想,用的时候再创建,能不加锁就不加锁,所谓的偏向锁,就是给线程加上一个非常轻量级的标记,如果没有人来竞争锁,就直接省略这样的加锁的操作,有的话则升级为轻量锁

2.轻量级锁状态(假设竞争较小)

此处的实现就是自旋锁,优点是可以第一时间拿到锁,缺点是比较消耗cpu资源

与此同时Synchronized也会计算锁竞争的激烈程度,从而来判断是否需要升级到重量级锁

对于轻量级锁来说,假设竞争这个锁的线程很多,那么大多数线程此刻就处自旋的状态,此刻就比较消耗cpu资源

3.重量级锁状态(假设竞争很大)

此时拿不到锁的线程就不会选择去自旋了,而是直接阻塞等待,直接让出cpu,当线程释放之后就会随机分配一个线程来持有这个锁

4.锁消除策略

Synchronized会自动判断线程加上的锁是否有效,在编译期间,如果判断无效就会自动把这个锁给干掉,比如说这里没有涉及到多个线程对成员变量的修改等等

5.锁粗化

会将多个细粒度的锁,合并成一个粗粒度的锁,避免了重复加锁解锁的过程

3.CAS策略 (避免使用锁的另一种解决线程安全问题的策略)

全称叫做compare and swap 就是比较和交换,其实是一个cpu指令

关于CAS的api都放在java的unsafe包内,也就是暂时不推荐去使用的

我们简单介绍一下它的观点与使用技巧

这里给出一段伪代码

address:内存中的地址

expectValue:寄存器1中的值

swapvalue:寄存器2中的值

比较内存中的值和寄存器1的值是否相同,相同则直接交换(赋值),返回一个true不相同则无事发生,返回一个false

java标准库也提供了很多原子类,保证了多线程操作一个数据是原子的,本质上就是基于cas的

我们这个时候用两个线程给她进行自增50000次就会获取到正确的结果,而不会出现线程安全问题了

原始标准库里的代码略显复杂,这里我们使用简化版本的进行说明

这里的一次自增操作是先拿到旧数据,然后使用cas进行操作,如果判断相等则直接写入内存,不相等则更新一下目前的旧值为内存中的最新值,从而进行自增,这里就不会出现线程安全问题了

如有问题,希望大家多多指正 

相关文章:

JavaEE 09 锁策略

1.锁策略 1.1 乐观锁与悲观锁 其实前三个锁是同一种锁,只是站在不同的角度上去进行描述,此处的乐观与悲观其实是指在预测的角度上看会发生锁竞争的概率大小,概率大的则是悲观锁,概率小的则是乐观锁 乐观锁在加锁的时候就会做较少的事情,加锁的速度较快,但是消耗的cpu资源等也会…...

javacv的视频截图功能

之前做了一个资源库的小项目,因为上传资源文件包含视频等附件,所以就需要时用到这个功能。通过对视频截图,然后作为封面缩略图,达到美观效果。 首先呢,需要准备相关的jar包,之前我用的是低版本的1.4.2&…...

Fiddler中AutoResponder的简单使用

AutoResponder,自动回复器,用于将 HTTP 请求重定向为指定的返回类型。 这个功能有点像是一个代理转发器,可以将某一请求的响应结果替换成指定的资源,可以是某个页面也可以是某个本地文件 1.使用 打开“Fiddler”,点击…...

K8S(一)—安装部署

目录 安装部署前提以下的操作指导(在master)之前都是三台机器都需要执行 安装docker服务下面的操作仅在k8smaster执行 安装部署 前提 以下的操作指导(在master)之前都是三台机器都需要执行 关闭防火墙 [rootk8smaster ~]# vim /etc/selinux/config [rootk8smaster ~]# swa…...

Kubernetes Pod 网段与主机内网网段互通

开发环境的需求 开发环境部署 K8s 后,服务器会部署在 K8s 里,通常 Pod 网段被隔离,主机无法访问 实际开发需求,往往需要当前开发调试的服务主机本地部署,其他服则在 K8s 内 因此,使用 K8s ,必…...

go学习redis的学习与使用

文章目录 一、redis的学习与使用1.Redis的基本介绍2.Redis的安装下载安装包即可3.Redis的基本使用1)Redis的启动:2)Redis的操作的三种方式3)说明:Redis安装好后,默认有16个数据库,初始默认使用0…...

娱乐新拐点:TikTok如何改变我们的日常生活?

在数字时代的浪潮中,社交媒体平台不断涌现,其中TikTok以其独特的短视频内容在全球范围内掀起了一场娱乐革命。本文将深入探讨TikTok如何改变我们的日常生活,从社交互动、文化传播到个人创意表达,逐步改写了娱乐的新篇章。 短视频潮…...

【Nginx】Nginx了解(基础)

文章目录 Nginx产生的原因Nginx简介Nginx的作用反向代理负载均衡策略动静分离 Nginx的Windows下的安装Linux下的安装Nginx常用命令 负载均衡功能演示 Nginx产生的原因 背景 一个公司的项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发…...

十九)Stable Diffusion使用教程:ai室内设计案例

今天我们聊聊如何通过SD进行室内设计装修。 方式一:controlnet的seg模型 基础起手式: 选择常用算法,抽卡: 抽到喜欢的图片之后,拖到controlnet里: 选择seg的ade20k预处理器,点击爆炸按钮,得到seg语义分割图,下载下来: 根据语义分割表里的颜色值,到PS里进行修改: 语…...

虚拟机VMware安装centos以及配置网络

目录 1、CentOS7的下载2、CentOS7的配置3、CentOS7的安装4、CentOS7的网络配置 4.1、自动获取IP4.2、固定获取IP 5、XShell连接CentO 准备工作:提前下载和安装好VMware。VMware的安装可以参考这一篇文章:VMware15的下载及安装教程。 1、CentOS7的下载 …...

call 和 apply:改变对象行为的秘密武器(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...

工作中 docker 的使用积累

2 进入 openwrt 容器 docker exec -it openwrt /bin/sh3 查看 docker 信息 docker info4 启动容器 4 挂载 overlay mount -t overlay overlay -o lowerdirA:B,upperdirC,workdirworker /tmp/test -t overlay : 指定要挂载的文件系统类型为 overlayoverlay: 指定…...

初识SpringSecurity

目录 前言 特点 快速开始 导入依赖 运行项目 访问服务 权限控制 实现UserDetails接口 添加SecurityConfig配置类 测试接口DemoController 设置权限控制authorizeHttpRequests 结果分析 总结 前言 Spring Security是一个强大且高度可定制的身份验证和访问控制框架…...

大数据讲课笔记1.4 进程管理

文章目录 零、学习目标一、导入新课二、新课讲解(一)进程概述1、基本概念2、三维度看待进程3、引入多道编程模型(1)CPU利用率与进程数关系(2)从三个视角看多进程 4、进程的产生和消亡(1&#xf…...

技术点:实现大文件上传

大文件上传 实现思路 对于大文件上传考虑到上传时间太久、超出浏览器响应时间、提高上传效率、优化上传用户体验等问题进行了深入探讨,以下初略罗列各个知识点的实现思路: 大文件上传对文件本身进行了文件流内容 Blob 的分割,使用 Blob.pr…...

记一次挖矿病毒的溯源

ps:因为项目保密的原因部分的截图是自己在本地的环境复现。 1. 起因 客户打电话过来说,公司web服务异常卡顿。起初以为是web服务缓存过多导致,重启几次无果后觉得可能是受到了攻击。起初以为是ddos攻击,然后去查看web服务器管理…...

day05-报表技术-图形报表

1、图表报表简介 ​ 在大数据时代,人们需要对大量的数据进行分析,帮助用户或公司领导更直观的察觉差异,做出判断,减少时间成本,而在web项目中除了表格显示数据外,还可以通过图表来表现数据,这种…...

【Spring】@Transactional事务属性详解

文章目录 1、事务传播行为注意事务传播行为在不同类之间调用生效Propagation.REQUIRED(默认传播行为)Propagation.REQUIRES_NEWPropagation.NESTED 2、事务的隔离级别隔离级别设置 3、设置事务异常回滚3.1、默认情况3.2、设置回滚异常3.3、设置不回滚的异常 4、超时时间5、只读…...

通过css3的锚定滚动属性,实现分页加载时让滚动条不闪动

html标签 <div scroll"handleScroll" id"list-container"style"overflow-anchor:auto;overflow-y: auto;height: 80vh"><ul id"talks"v-for"(item,index) in msgList":key"item.roleiditem.timeitem.conten…...

使用Selenium与Scrapy处理动态加载网页内容的解决方法

博客正文&#xff08;包含详细注释&#xff09; 引言 在爬虫技术领域&#xff0c;处理动态加载的网页内容常常是一项挑战&#xff0c;尤其是对于那些通过用户滚动或其他交互动态加载更多内容的网站。本文将介绍如何结合使用Selenium和Scrapy来有效处理这类网页。 初探Seleni…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...