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…...
技术点:实现大文件上传
大文件上传 实现思路 对于大文件上传考虑到上传时间太久、超出浏览器响应时间、提高上传效率、优化上传用户体验等问题进行了深入探讨,以下初略罗列各个知识点的实现思路: 大文件上传对文件本身进行了文件流内容 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处理动态加载网页内容的解决方法
博客正文(包含详细注释) 引言 在爬虫技术领域,处理动态加载的网页内容常常是一项挑战,尤其是对于那些通过用户滚动或其他交互动态加载更多内容的网站。本文将介绍如何结合使用Selenium和Scrapy来有效处理这类网页。 初探Seleni…...
Linux的权限(二)
目录 前言 文件类型和访问权限(事物属性) 补充知识 文件类型 文件操作权限 修改文件权限 chmod指令 文件权限值的表示方法 字符表示方法 8进制数值表示方法 权限有无带来的影响 修改文件角色 chown与chgrp指令 目录的rwx权限 补充知识 …...
网络服务IP属地发生变化的原因有哪些?
近期,许多用户发现自己的网络服务IP属地发生了变化。原本固定的IP地址不再是静态的,而是发生了变动。这一现象引起了广大用户的关注和疑惑,对网络服务的使用和信息安全产生了影响。为了解决用户的疑虑,我们对此现象进行了深入探究…...
OpenGL 着色器程序的保存和加载(二进制)
背景 为了提高OpenGL 着色器程序的编译和链接速度,我们可以将程序保存为二进制进行加载,可以大幅度提升加载效率。 方法 以下是加载和保存二进制程序的方法。 // 加载着色器程序的二进制文件到已创建的着色器程序中 bool loadPragram(const std::str…...
【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换
前言 【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换一、多语言本地化插件 Localization1.1 介绍1.2 效果展示1.3 使用说明 二、 插件导入并配置2.1 安装 Localization2.2 全局配置 三、多语言映射表3.1 创建多语言文本配…...
疯狂SQL转换系列- SQL for Tencent Cloud VectorDB
为了尽量保证使用者通过统一的SQL标准访问各类型数据库,我们这里开启了“疯狂SQL转换系列”。转换的语法效果不一定是最好的,更多是为用户提供一个统一的数据库交互体验。转换数据库目标的确认更多是内生的。基于我们对业务发展的需要。该向量库SQL转换的…...
Excel中的INDIRECT函数用法
当在 Excel 中使用 INDIRECT 函数时,它可以帮助我们通过引用字符串中的单元格地址来获取对应单元格的值。这个函数非常有用,特别是在需要动态地引用其他单元格的情况下。下面是 INDIRECT 函数的一些用法和示例: 基本用法: INDIREC…...
Spring-temp
IOC/DI实现步骤 1.配置元数据 2.实例化IOC 3.获取Bean 基于XML配置方式 管理组件 1.基于构造函数:有参、无参 2.基于静态工厂方法:有参、无参 依赖注入 1.构造函数 2.setter方法 Bean组件高级特性 1.作用域 2.生命周期 FactoryBean 基于注解 IOC Bean作…...
【C++干货铺】会搜索的二叉树(BSTree)
个人主页点击直达:小白不是程序媛 C系列专栏:C干货铺 代码仓库:Gitee 目录 前言: 二叉搜索树 二叉搜索树概念 二叉搜索树操作 二叉搜索树的查找 二叉搜索树的插入 二叉搜索树元素的删除 二叉搜索树的实现 BSTree结点 …...
【Spring AOP】 动态代理
一.AOP常见的实现方式 1.Spring AOP 2.aspectJ 注意:spring使用的是aspectJ的注解,但实现是spring自身实现的. 二.AOP原理 Spirng AOP原理 , 基于动态代理实现的. 三.代理模式 作用就是提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类…...
NAT——网络地址转换
目录 一、概念 二、NAT的分类 1.静态NAT 1.1 静态NAT的配置 1.2 利用eNSP小实验加强对静态NAT的理解 2、动态NAT 三、NAPT——端口映射 四、Easy IP 使用一个公网地址可以让所有人都上公网 一、概念 随着Internet的发展和网络应用的增多,IPv4地址枯竭已经成为…...
中组部 两学一做网站/舆情信息在哪里找
珠海源创会图文回顾及PPT分享>>> ArduPilot/APM是一款开源自动导航系统,支持多旋翼飞行器,传统直升机,固定翼飞机与传统直升机。源码由一个大型爱好者社区开发。 支持的导航板 目前,ArduPilot/APM支持如下自动导航板 …...
网站分析模板/安卓优化大师官方版
暴力就好了 #include<bits/stdc.h> using namespace std; int a,b,c; int main(){cin>>a>>b>>c;for(int i1;;i){if(i%23a&&i%233b&&i%2333c){cout<<i;return 0;}} }...
个人网页设计师/长沙百度快速优化排名
Ⅰ、概述 打开上一篇文章新建的工程,是提取的ST标准库里面源代码文件和UCOS工程包源代码文件。下载过的朋友可能会知道,直接编译那个工程会有大片的错误和警告,原因在于那个工程是没有经过修改源代码的工程,接下来就是讲述一步一步…...
网站建设我要自学网/宣传推广方案
自然框架里的元数据 元数据的职责: 自然框架里的元数据有三个职责:描述数据库(字段、表、视图等),描述项目(功能节点、操作按钮等),项目和数据库的关系(一个列表页面里…...
wordpress标签链接优化/做网站优化推广
Python函数(四)-递归函数递归函数就是函数在自己内部调用自己 # -*- coding:utf-8 -*- __author__ "MuT6 Sch01aR" def Digui(n): print(n ...Python函数篇(二)之递归函数、匿名函数及高阶函数1.全局变量和局部变量 一般定义在程序的最开始的变量…...
wordpress可视化菜单/黄页推广
一、选择题(本题为单项选择题,每题1分,多选,不选或错选均不得分,):(25分)1、世界上第一台电子数字计算机是(B)年出现的。A、1958B、1946C、1965D、19472、微型计算机的发展史可以看作是(A )的发展历史。A、微处理器B、…...