搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
小小林熬夜学编程
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Java高并发编程实战1,那些年学过的锁_高并发实战代码
2
人工智能—线性回归模型笔记
3
Hive数据导出的四种方法_hive导出数据到本地
4
全网最详细用c语言实现植物大战僵尸游戏(上)_c++植物大战僵尸代码
5
【JAVA UI】HarmonyOS Glide简单使用_鸿蒙glide使用
6
bert 应知应会_bert公式
7
MySQL的缓冲池(buffer pool)及 LRU算法_buffer pool 污染
8
基于Java+SpringBoot+Vue前后端分离聊天即时通讯系统设计与实现_基于java+spring的聊天系统设计
9
C语言 strcpy字符串拷贝的实现_编程实现字符串的拷贝功能。要求分别使用两种方法实现:使用strcpy函数;不使用strc
10
Immunity Canvas 7.26 Windows安装踩坑_immunity canvas kali
当前位置:
article
> 正文
5分钟彻底理解Java中的乐观锁、悲观锁、自旋锁、可重入锁_乐观锁有哪些 java
作者:小小林熬夜学编程 | 2024-05-12 21:29:02
赞
踩
乐观锁有哪些 java
1.乐观锁
乐观锁
是一种乐观思想
,假定当前环境是读多写少,遇到并发写的概率比较低,读数据时认为别的线程不会正在进行修改(所以没有上锁)。写数据时,判断当前与期望值是否相同,如果相同则进行更新(更新期间加锁,保证是原子性的)。
Java中的
乐观锁
:
CAS
,比较并替换,比较当前值(主内存中的值),与预期值(当前线程中的值,主内存中值的一份拷贝)是否一样,一样则更新,否则继续进行CAS操作。
如下图所示,可以同时进行读操作,读的时候其他线程不能进行写操作。
2.悲观锁
悲观锁
是一种悲观思想
,即认为写多读少,遇到并发写的可能性高,每次去拿数据的时候都认为其他线程会修改,所以每次读写数据都会认为其他线程会修改,所以每次读写数据时都会上锁。其他线程想要读写这个数据时,会被这个线程block,直到这个线程释放锁然后其他线程获取到锁。
Java中的
悲观锁
:
synchronized
修饰的方法和方法块、
ReentrantLock
。
如下图所示,只能有一个线程进行读操作或者写操作,其他线程的读写操作均不能进行
3.自旋锁
自旋锁
是一种技术:
为了让线程等待,我们只须让线程执行一个忙循环(自旋)。现在绝大多数的个人电脑和服务器都是多路(核)处理器系统,如果物理机器有一个以上的处理器或者处理器核心,能让两个或以上的线程同时并行执行,就可以让后面请求锁的那个线程“稍等一会”,但不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁。
自旋锁
的优点:
避免了线程切换的开销。挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给Java虚拟机的并发性能带来了很大的压力。
自旋锁
的缺点:
占用处理器的时间,如果占用的时间很长,会白白消耗处理器资源,而不会做任何有价值的工作,带来性能的浪费。因此自旋等待的时间必须有一定的限度,如果自旋超过了限定的次数仍然没有成功获得锁,就应当使用传统的方式去挂起线程。
自旋
次数默认值:
10次,可以使用参数-XX:PreBlockSpin来自行更改。
自适应
自旋
:
自适应意味着自旋的时间不再是固定的,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定的。有了自适应自旋,随着程序运行时间的增长及性能监控信息的不断完善,虚拟机对程序锁的状态预测就会越来越精准。
Java中的
自旋锁
:
CAS操作中的比较操作失败后的自旋等待。
如下图
4. 可重入锁(递归锁)
可重入锁
是一种技术:
任意线程在获取到锁之后能够再次获取该锁而不会被锁所阻塞。
可重入锁
的原理:
通过组合自定义同步器来实现锁的获取与释放。
再次获取锁:识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。获取锁后,进行计数自增。
释放锁:释放锁时,进行计数自减。
Java中的
可重入锁
:
ReentrantLock、synchronized修饰的方法或代码段。
可重入锁
的作用:
避免死锁。
如下图:
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/560653
推荐阅读
article
基于
web
得
红色
旅游
管理系统
(JSP+
java
+springmvc+
mysql
+MyBatis)_w...
然而,传统的
红色
旅游
管理方式存在诸多问题,如信息不透明、预订困难等。基于
web
的
红色
旅游
管理系统
能够有效地解决这些问题,...
赞
踩
article
[附源码]
JAVA
+ssm
计算机
毕业设计
毕业生
信息管理系统
(程序+Lw)_
管理信息系统
毕业设计
...
项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+...
赞
踩
article
java
redis
geo
_
Redis
GEO...
Redis
GEO
Redis
GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在
Redis
3.2 版...
赞
踩
article
java
.
lang
.RuntimeException:
Driver
com.
mysql
.cj.jd...
原因可能:application.yml的password没有加双引号password: "root"为什么是可能,因为...
赞
踩
article
java
adminlte
使用_
AdminLTE
实现动态
菜单
...
前言本篇内容基于上一篇
AdminLTE
实现局部刷新,在完成局部刷新后,不满足其左侧
菜单
栏的写死状态,希望后期能从数据库读...
赞
踩
article
java
上传文件到
Azure
Blob
,并且使用sas连接
blob
_
java
的
azure
bl...
提示:访问
blob
的时候需要将你的ip加入官网中,否则会报403错误。_
java
的
azure
blob
操作
java
...
赞
踩
article
华为OD机试 -
m>小华
m>
m>地图
m>
m>寻宝
m>(
m>Java
m> & JS & Pytho
m>n
m> &
m>C
m> &
m>
m>C
m>++
m>)_
m>小华
m>按照...
华为OD机试 -
m>小华
m>
m>地图
m>
m>寻宝
m>(
m>Java
m> & JS & Pytho
m>n
m> &
m>C
m> &
m>
m>C
m>++
m>),实现:深度优先搜索 || 广...
赞
踩
article
java
跳出
多重
嵌套循环
_干货,
Java
面试中常被问到的几大
技术难题
...
大家在平常面试
java
的过程中都会遇到哪些难题呢?还有一些即将去面试
java
的童鞋们,你们想知道技术面试中会涉及到哪些点...
赞
踩
article
Java
:
全局
变量
(
成员
变量
)与
局部
变量
_
java
怎么把
局部
变量
的值赋给
全局
变量
...
分类细则:
变量
按作用范围划分分为
全局
变量
(
成员
变量
)和
局部
变量
成员
变量
按调用方式划分分为实例属性与类属性 (有关实例属性...
赞
踩
article
Java
(
面
试
题准备(
非技术
面
)(
仅供参考
))_
java
面
试
非技术
问题...
Java
(
面
试
题准备(
非技术
面
)(
仅供参考
))_
java
面
试
非技术
问题
java
面
试
非技术
问题 ...
赞
踩
article
【
Java
EE】日志框架(
SLF4J
)与门面
模式
_
java
slf4j
...
⻔⾯
模式
(Facade Pattern)⼜称为外观
模式
,提供了⼀个统⼀的接⼝,⽤来访问⼦系统中的⼀群接⼝.其主要特征是定...
赞
踩
article
JAVA
全局变量
声明
与定义_
javafx
怎么
声明
全局变量
...
JAVA
全局变量
(或称成员变量)可分两种,一种是静态变量,另一种是实例变量,即在类体中定义的变量,有三点得注意: 一、成...
赞
踩
article
全网最全
Aspose
.
Words
For
JAVA
高级
使用
教程(文末涵2024最新无水印包)...
Aspose
.
Words
是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈...
赞
踩
article
【
Java
EE】
MyBatis
使用
注解
操作
数据库
...
MyBatis
使用
注解
操作
数据库
,参数传递,
MyBatis
使用
注解
实现增删改查,结果映射,开启驼峰命名(推荐)【
Java
...
赞
踩
article
[
Java
EE] 多
线程
(六)
:
线程
池
与
定时器
...
我们前面提到,
线程
的创建要比进程开销小,但是如果
线程
的创建/销毁比较频繁,开销也会比较大.所以我们便引入了
线程
池
,
线程
池
...
赞
踩
article
java
web
项目
开发
难点_基于
java
Web
项目
SSM
配置
要点及可能遇到的问题和解决方法......
我发现网上许多讲解
java
web
项目
SSM
(Spring,SpringMVC,Mybatis)
配置
的时候有些重点没有...
赞
踩
article
刚从
大厂
面试
回来
,
分享我
的
java
后
端
面试
经历(腾讯五面)_
后
端
面试
好
面试
吗?...
大厂
面试
职位:
java
后
端开发工程师。在
大厂
的
面试
前三面真
的
有点急促
,
一周内就面完了三次
面试
,
接着就开始无尽
的
等待
,
整...
赞
踩
article
一个
3
年
Java
程序员
5 家
大厂
的
面试
总结(已拿
Offer
)_
3
年后端
大厂
真实面经...
无论是哪家公司,都很重视高并发高可用
的
技术,重视基础,重视 JVM。
面试
是一个双向选择
的
过程,不要抱着畏惧
的
心态去
面试
,...
赞
踩
article
Java 中
String
str
= "
hel
lo
world
" 和
String
str
= ne...
String
str
= "
hel
lo
world
" 和
String
str
= new
String
("
hel
lo
...
赞
踩
article
jenkins
:无法连接
仓库
:
Command
“
git
ls-remote -h --
https
:...
方案2:无法设置
仓库
是公开的,那就需要在
jenkins
中配置
仓库
的密钥了,这个暂时不会,后续在补充 TODO。我在创建j...
赞
踩
相关标签
前端
java
mysql
课程设计
mybatis
数据库
人工智能
java redis geo
开发语言
java adminlte 使用
azure
microsoft
算法
华为机试
Java
JavaScript
Python
C语言
C++
java 跳出多重嵌套循环
java中static
java有没有goto
概念辨析
变量
面试