Java并发:从超卖问题到锁的升级过程

devtools/2024/9/25 3:54:59/

假如我们现在有一百个线程,商品A库存量为100,售出方法为sale()

在没有上锁是,即时我们设置当库存量为零时停止售卖,但是也极有可能出现超卖的情况,这是由于我们售卖的方法没有原子性,在售出的过程中,库存为零时,其他线程可能刚好调用方法,这时条件没有更改,所以是无法及时停止的。

synchronized关键字

        使sale()方法一次最多服务一个线程,这样就解决了超卖的问题,此时涉及到锁升级过程

初始状态,线程A发过来请求,请求获取锁,此时sale()的对象锁处于空闲状态,获取成功,对象锁的对象头部分包含markword,用于记录当前获取锁的线程,此时为偏向锁,获取成功之后执行sql语句。

        线程A此时还在使用 sale()方法,也就是仍然占有这个锁,此时线程B过来了,也想要执行这个方法,那也需要获取这个锁,此时线程B将自己的线程ID与markword中记录的id进行对比,发现不同,那么锁升级为轻量级锁,线程B在旁边不断地CAS自旋尝试获取锁。

CAS不断地自旋其实是很消耗资源的,当线程B多次CAS仍然无法获取到锁的话,此时锁升级为重量级锁,线程B进入阻塞队列沉睡,等待唤醒。

        此时,如果其他线程想要尝试获取锁,竞争失败都会进入阻塞队列进行沉睡。只有当A执行完,释放锁,此时阻塞队列中的线程被全部唤醒,竞争成功的获取锁进而执行,其他竞争线程失败的继续沉睡,等待下一轮的唤醒。


http://www.ppmy.cn/devtools/4330.html

相关文章

账号安全基本措施2

sudo命令 sudo(superuser do),允许系统管理员让普通用户执行一些或者全部的root命令的一个工具。 其配置在/etc/sudoers权。它允许系统管理员集中的管理用户的使用权限和使用的主机。属性必须为0440。 语法检查: 检查语法: 修改文件时&…

<script>和<script setup>的区别

在Vue 3中&#xff0c;<script setup>是Composition API的一个语法糖&#xff0c;它提供了一种更简洁的方式来编写组件逻辑。使用<script setup>&#xff0c;您可以在组件外部直接导入或定义方法和响应式数据&#xff0c;而不需要在setup()函数内部进行。 <scr…

屏幕状态自动检测+鼠标自动操作

目录 一、写在前面 1.1适用场景 1.2涉及到的库 二、函数库 2.1pyautogui-屏幕截图&鼠标操作 2.1.1屏幕截图screenshot函数 2.1.2鼠标移动及单击 2.2Opencv-模板匹配 2.2.1matchTemplate函数 2.2.2minMaxLoc函数 2.2.3相关代码 2.3base64-图片转base64 2.3.1在线…

Linux环境部署MySQL

LINUX环境下部署MySQL MySQL官网&#xff1a;https://www.mysql.com/ MySQL是一种关系型数据库管理系统&#xff0c;所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策&#xff0c;分为社区版和商业版&#xff0c;由于其体积小、速度快、总体…

若依框架后台管理系统_修改后台管理密码

若依框架后台管理系统_修改后台管理密码 1. 找见加密函数&#xff1a; /*** 生成BCryptPasswordEncoder密码** param password 密码* return 加密字符串*/public static String encryptPassword(String password){BCryptPasswordEncoder passwordEncoder new BCryptPasswordE…

关于Python中install edge_tts记录

如下代码&#xff1a; #!/usr/bin/env python3""" Basic audio streaming example.This example shows how to stream the audio data from the TTS engine, and how to get the WordBoundary events from the engine (which could be ignored if not needed).…

PHP 爬虫如何配置代理 IP(CURL 函数)

在 PHP中 配置代理IP&#xff0c;可以通过设置 CURL 库的选项来实现&#xff0c;代码如下&#xff1a; 当然你要有代理ip来源&#xff0c;比如我用的这个 代理商 &#xff0c;如果想服务稳定不建议找开源代理池&#xff0c;避免被劫持。 <?php // 初始化cURL会话 $ch cu…

外包干了10天,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了南京一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…