Java锁的策略

White graces:个人主页

🙉专栏推荐:Java入门知识🙉

🙉 内容推荐:<多线程案例(线程池)>🙉

🐹今日诗词:"你我推心置腹, 岂能相负"🐹


目录

锁的策略

乐观锁和悲观锁

轻量级锁和重量级锁

自旋锁和挂起等待锁

自适应锁(synchronized)

普通互斥锁和读写锁

公平锁和非公平锁

可重入锁和不可重入锁

synchronized是哪种类型的锁

mutex是哪种类型的锁

synchronized内部工作原理

1. 偏向锁阶段

2.  轻量级锁阶段

3.重量级锁阶段

锁消除

锁粗化

小结

 CAS

原子类

CAS的ABA问题

美图分享


⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏

⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏


锁的策略

锁策略有很多种,大致分为:

1. 乐观锁和悲观锁

2. 轻量级锁和重量级锁

3. 自旋锁和挂起等待锁

4. 自适应锁

5. 普通互斥锁和读写锁

6. 公平锁和非公平锁

乐观锁和悲观锁

乐观锁: 在加锁之前进行预估, 如果预估锁冲突的概率很小, 加锁时就不会进行太多操作

悲观锁: 预估锁冲突概率很大, 加锁的操作就会很复杂,防止代码出错

乐观锁加锁过程做的操作较少,因此加锁速度可能比较快,但是可能容易出现错误

悲观锁加锁操作比较多, 加锁速度较慢,但是不容易出错

轻量级锁和重量级锁

和乐观锁和悲观锁不同的是: 轻量级和重量级是对加锁之后,对加锁结果的评价

轻量级锁: 加锁速度快,开销小就是轻量级锁, 一般也叫乐观锁

重量级锁: 加锁速度慢,开销大就是重量级锁, 一般也叫悲观锁

自旋锁和挂起等待锁

自旋锁和挂起等待锁就是轻量级锁和重量级锁的典型实现

自旋锁: 加锁的时候搭配一个循环,循环执行的过程就是自旋, ,自旋检测到其他线程释放锁时,第一时间就会加上锁,没有就进行下一次循环. 如果一直循环,就会长时间占用CPU资源, 因此自旋锁比较适用于锁冲突较少的情景, 是一种乐观锁

挂起等待锁: 当加锁线程特别多时, 如果使用自旋锁, 长时间循环,会浪费CPU资源, 如果此时让他挂起等待, 把CPU资源让出来, 因此挂起等待锁是一个悲观锁, 适用于锁冲突比较激烈的情景, 当挂起等待时,内核调度器会介入,这里的操作会比较多,真正获取到锁花的时间也会更多

自适应锁(synchronized)

synchronized可以对锁冲突进行评估,选择最合适的锁策略, 因此也叫做自适应锁

普通互斥锁和读写锁

普通互斥锁: 就是synchronized的加锁,解锁

读写锁: 分成加读锁和加写锁

加读锁: 一个线程加锁和读锁时, 另一个线程只能读锁, 不能写锁

加写锁: 一个线程加锁和写锁时, 另一个线程既不能读锁, 也不能写锁

公平锁和非公平锁

公平锁: 遵循先来后到, 排在最前面的线程最先获取加锁资格

非公平锁: 线程加锁顺序是随机的, 为非公平锁

下面这个图很形象

可重入锁和不可重入锁

概念: 对同一个线程加锁两次不会死锁, 反之则是不可重入锁

synchronized是哪种类型的锁

1. 乐观锁/悲观锁自适应

2. 轻量级锁/重量级锁自适应

3. 自旋锁/挂起等待锁自适应

4. 不是读写锁

5. 非公平锁

6. 可重入锁 看     

mutex是哪种类型的锁

mutex是Linux中的锁

1. 悲观锁

2. 重量级锁

3. 挂起等待锁

4. 不是读写锁

5. 非公平锁

6. 不可重入锁

synchronized内部工作原理

当对象执行到synchronized时, 如果对象处于未加锁的状态时,会分成三个阶段执行

1. 偏向锁阶段

2. 轻量级锁阶段

3. 重量级锁阶段

1. 偏向锁阶段

核心思想: 懒汉模式, 能不加锁就不加锁, 能晚加锁就晚一点加锁

偏向锁并没有加锁, 只是做了一个标记, 如果没有其他线程来竞争这个锁, 不加锁可以大幅度提高代码执行效率, 如果有其他线程想加锁, 就会提前抢在这个线程之前加锁, 总的来说就是非必要不加锁.

注意: 对象首次加锁先进入偏向锁, 如果没有锁竞争, 下次加锁还是先进入偏向锁, 

如果出现锁竞争了, 就会进入轻量级锁, 并且下次加锁时跳过偏向锁阶段, 直接进入轻量级锁阶段

2.  轻量级锁阶段

synchronized内部会统计有多少个线程参与对这个锁对象的竞争, 根据这个进一步区分轻量级锁和重量级锁

轻量级锁阶段就是: 线程之间有竞争, 但是不多, 轻量级锁一般通过自旋锁实现

优势: 其他线程释放锁, 自旋锁能够第一时间获取到锁

坏处: 内部一直循环比较消耗CPU

对于自旋锁来说, 如果同一个锁对象竞争者很多, 大量线程都在自旋, 这时候CPU开销就会非常大, 需要考虑升级为自旋锁

3.重量级锁阶段

重量级锁, 不会让线程自旋了, 而是阻塞等待, 把CPU资源让出来, 当线程释放锁时, 系统就会随机唤醒一个线程进行加锁

锁消除

也是synchronized内部一种优化方式, 代码编译过程中, 如果发现不需要加锁, 编译器就会直接把锁给干掉

锁粗化

编译器会把一些细粒度的锁合并成一个粗粒度的锁

细粒度: synchronized () {  }, 一般情况下, 大括号里的代码越少, 细粒度越高.

细粒度高的好处: 由于代码少执行速度较快, 加锁解锁的速度也快, 有利于线程并发执行

细粒度高的坏处: 频繁的加锁解锁可能会造成线程阻塞

有些情况下还是希望锁粗粒度更好, 比如职场工作中, 你做完一个任务就去打电话给领导汇报一下成果, 又做完一个任务再去打电话给领导汇报成果,反复如此, 领导就会烦, 并且你汇报的过程, 其他员工也可能在汇报成果(此时你就阻塞了), 因此你可以把多个成果合并在一起给领导进行汇报

小结

synchronized内部优化策略大致有这些

1. 锁升级: 偏向锁 -> 轻量级锁 -> 重量级锁

2. 锁消除: 自动干掉不必要的锁

3. 锁粗化: 将细粒度的锁合并成粗粒度的锁

 CAS

compare and swap ,这是一条CPU指令, 和Java关系不大, 但是面试要考

表示比较和交换, 这是一条原子指令, 安全性杠杠的,不会出现线程安全问题

原子类

Java中一些类对CAS指令进行了封装, 构成了原子类, 封装在

import java.util.concurrent.atomic这个包下面

这些类可以保证参数进行操作的原子性

最常用的莫过于AtomicInterger类了

它保证了关于int类型的数据加或者减都是原子操作

CAS的ABA问题

CAS指令是比较, 如果相等就交换, 但是根据唐妞不等式  相等 != 没改变过  直接秒了

比如: A -> B ->  A   还是相等, 但是A已经发生过改变

CAS在大多数情况下是安全的

极端情况下可能会出一些问题: 比如银行取款, 取款按钮用户可能会多按几下,

这是系统就会有很多扣款请求

这种情况其实挺常见的,比如电梯按钮,很多人就会狂按

具体执行流程如下:

但是扣款过程中有人向账户里转入500块呢

执行流程:

这种情况非常苛刻, 用户连续点击多次,取钱的时正好有人转入, 并且转入金额和取出金额相同

账户余额只是一个数字可加可减, 我们引入一个只能加不能减的版本号, 通过判断版本号来选择执行操

美图分享


✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄

⭐️点赞收藏加关注,学习知识不迷路⭐️

🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️

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

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

相关文章

牛客网刷题 | BC99 正方形图案

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 KiKi学习了循环&am…

Linux(四)

Linux&#xff08;四&#xff09; shell脚本shell脚本开发过程创建创建.sh文件编写.sh文件添加执行的权限 chmod 777 1.sh运行 shell中注释shell中变量用户自定义变量 (尽量大写)位置参数即命令行参数预定义变量环境变量 shell中程序和语句说明性语句功能性语句echo 输出read 键…

【深度学习】2.单层感知机

目标&#xff1a; 实现一个简单的二分类模型的训练过程&#xff0c;通过模拟数据集进行训练和优化&#xff0c;训练目标是使模型能够根据输入特征正确分类数据。 演示: 1.通过PyTorch生成了一个模拟的二分类数据集&#xff0c;包括特征矩阵data_x和对应的标签数据data_y。标签…

UniApp 2.0可视化开发工具:引领前端开发新纪元

一、引言 在移动互联网迅猛发展的今天&#xff0c;移动应用开发已经成为前端开发的重要方向之一。为了简化移动应用开发流程&#xff0c;提高开发效率&#xff0c;各大开发平台不断推出新的工具和框架。UniApp作为一款跨平台的移动应用开发框架&#xff0c;自诞生以来就备受开…

航运复兴?大摩不信!

大摩认为&#xff0c;从供需关系来看红海危机只是推迟了航运业下行周期的到来&#xff0c;一旦干扰消除&#xff0c;行业可能重回周期性低迷。 红海危机加剧运力紧张&#xff0c;航运市场价格飞涨。 大摩在24日的一份报告中指出&#xff0c;受红海危机干扰航运市场运力&#…

如何恢复未保存或丢失的Word文档?

许多用户会遇到Word文档未保存而关闭的问题。实际上&#xff0c;您不会立即丢失未保存的文档数据。请不要对文档进行进一步的更改&#xff0c;例如修改并再次保存。您仍然有机会恢复未保存的Word文档。有一些方法可以帮助您恢复未保存的 Word 文档。 如果您不幸遇到这样的问题…

基于单片机设计的多功能数字电压表开发

摘 要&#xff1a;在电路设计中我们时常会用到电压表&#xff0c;过去大部分电压表还是模拟的&#xff0c;虽然精度较高但模拟电压表采用用指针式&#xff0c;里面是磁电或电磁式结构&#xff0c;所以响应较慢。为适应许多高速信号领域目前已广泛使用数字电压表。数字电压表的诞…

各大排序算法

目录 插入排序 希尔排序(缩小增量排序) 冒泡排序 快速排序 选择排序 归并排序 插入排序 插入排序的基本思想是,将N个待排序元素分为一组有序表和一个无序表,一开始有序表只有一个元素,无序表中有N-1个元素,排序过程中每次取无序表的第一个元素依次与有序表的元素进行对比…

Leetcode260

260. 只出现一次的数字 III - 力扣&#xff08;LeetCode&#xff09; class Solution {public int[] singleNumber(int[] nums) {//通过异或操作,使得最终结果为两个只出现一次的元素的异或值int filterResult 0;for(int num:nums){filterResult^num;}//计算首个1(从右侧开始)…

c++ 虚函数常见问题

1 虚函数&#xff0c;虚表基础 虚函数&#xff0c;虚表基础 2 虚函数表保存在哪里 ? 虚函数表在编译的时候确定。在 linux 下&#xff0c;保存在只读数据段的重定位段&#xff0c;这个段的名字是 .data.rel.ro。 如下代码&#xff0c;编译之后&#xff0c;使用 readelf -t a…

vue3 vite项目配置了proxy代理情况下查看真实的接口调用地址

vite配置了proxy代理情况下如何查看真实的接口调用地址? 使用vite进行代理 在vite.config.ts配置了代理 在浏览器查看请求头和响应头发现只有代理前的url&#xff0c;没有显示代理后的路径 然后发现一个bypass函数&#xff0c;但是此函数只能修改res响应头的数据&#xff0…

Visual Studio 的调试(一)

最近事儿很多昂&#xff0c;更新速度相较以往慢了许多&#xff0c;备考六月份的四级&#xff0c;还有学校的期末等等&#xff0c;事儿真的太多啦&#xff0c;所以后面的更新速度也会放慢一点&#xff0c;实在是抽不开身啊诸位&#xff0c;相当抱歉&#xff0c;还望诸君见谅 言…

原哥花了1个多月的时间终于开发了一款基于android studio的原生商城app

大概讲一下这个app实现的功能和前后端技术架构。 功能简介 广告展示商品展示跳转淘宝联盟优惠卷购买发布朋友圈宝妈知识资讯商品搜索朋友圈展示/点赞/评论登陆注册版本升级我的个人资料商品和资讯收藏我的朋友圈意见反馈 安卓端技术选型 Arouter组件化daggerrxjavaretrofit…

遇见问题-VMware虚拟机打开运行一段时间后卡死

1.问题原因 因为Windows自带的虚拟化软件Hyper-V与VMware存在冲突。 2.关闭Hyper-V 1.打开【控制面板】-【程序和功能】-【启用或关闭Windows功能】3.关闭HV主机服务 1.右击计算机-》管理-》服务和应用名称-》服务-》找到HV主机服务-》右击属性停止服务 -》启动类型设置为禁…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(十三)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 我们&#xff0c;继续讲一…

乡村振兴的农业品牌建设:打造农业品牌,提升农产品附加值,增强乡村经济竞争力,实现美丽乡村经济繁荣

目录 一、引言 二、农业品牌建设的重要性 &#xff08;一&#xff09;提升农产品附加值 &#xff08;二&#xff09;增强乡村经济竞争力 &#xff08;三&#xff09;实现美丽乡村经济繁荣 三、农业品牌建设的现状及问题 &#xff08;一&#xff09;现状 &#xff08;二…

python-10(爬虫)

1.网络爬虫 1.1.引言 我们平时都说Python爬虫&#xff0c;其实这里可能有个误解&#xff0c;爬虫并不是Python独有的&#xff0c;可以做爬虫的语言有很多例如&#xff1a;PHP、JAVA、C#、C、Python。 为什么Python的爬虫技术会异军突起呢&#xff1f; Python火并不是因为爬…

兵器室管控系统|DW-306是一套成熟系统

概述 智慧兵器室管理系统&#xff08;DW-S306&#xff09;是依托互3D技术、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 本解决方案利用现有内部网络&#xff0c;部署部队智能兵器室管理系统&#xff…

使用Django框架搭建Web应用

文章目录 简介安装Django创建一个Django项目创建一个Django应用编写视图配置URL运行开发服务器总结与拓展数据库集成管理后台表单处理模板引擎安全性 简介 Django 是一款基于 Python 语言的开源 Web 应用框架&#xff0c;采用了 MVC&#xff08;模型-视图-控制器&#xff09;设…

数据库系统原理实验报告6 | 视图

整理自博主本科《数据库系统原理》专业课自己完成的实验报告&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 专业课本&#xff1a; ​ ———— 本次实验使用到的图形化工具&#xff1a;Heidisql ​ 目录 一、实验目的 二、实验内容 1&#xff0e;根据EDUC数…