java常见锁策略分享(包括cas和synchronized的优化)

前言

    锁策略学习思维导图:

1.常见锁策略

     ①  乐观锁和悲观锁

           ● 它们是根据锁冲突的预测,如果预测锁冲突比较小,那就是乐观锁,反之,就是悲观锁.

           ● 举个例子:高考前夕,我总觉得高考题会很难,然后拼命做各种科目的题,全副武装的去应对高考,而我妈则觉得高考只是人生的一个阶段而已,让我放平心态,顺其自然就好了.在这个例子中,我就相当于一个悲观锁,预测高考题的难度大不大类比于预测锁冲突大不大,我妈就相当于一个乐观锁.针对不同的锁,做出的事情也会不一样.

     ②  轻量级锁和重量级锁

           ● 轻量级锁的加锁解锁操作过程快且高效,而重量级锁则相反.就跟我们提东西上楼梯一样,轻的东西肯定上楼快一些,整个过程就会短一些,但是我们提的东西如果很重,那上楼就会相对于慢一些,那么整个过程就会长.

     ③  自旋锁和挂起等待锁

           ● 当遇到锁冲突的时候,自旋锁会一直忙等,不停尝试加锁,很消耗CPU资源,但是这样也有一个好处,那就是当锁被释放,能第一时间获取到锁,它是基于纯用户态实现的,无需太多时间,而挂起等待锁则基于内核机制实现,时间会更长,它不忙等,在遇到锁冲突后,可以去做别的工作,也因为如此,它不能在锁释放后,第一时间获取到锁.

          ● 举个例子: 我追帅哥的时候,等到相处一段时间了,跟他告白了,但是他拒绝我了,说他暂时不想谈恋爱,嘤嘤嘤我脸皮厚,每天照样跟他发信息,这样等他想谈恋爱的时候,我就能及时的知道,让他跟我在一起.还有一种选择就是他拒绝我之后,我就去努力提升自己,让自己变得更优秀,等他什么时候想谈恋爱,我再去告白,但是这样我就不能及时知道他什么时候才想谈恋爱了.

     ④  互斥锁和读写锁

           synchronized就是互斥锁,只是单纯加锁解锁操作,只针对一个锁进行操作,但是读写锁分为读锁和写锁,操作有三步,先给读加锁,然后给写加锁,最后释放锁.

注: 针对同一变量:

       ● 读锁和读锁之间没有锁冲突,所以无需等待.

       ● 读锁和写锁之间和写锁与写锁之间就会有锁冲突,需要等待.

     ⑤  可重入锁和不可重入锁

           连续对同一锁对象进行加锁,如果出现死锁状态,那么就是不可重入锁,反之则是可重入锁.

注:如果大家对死锁不太熟悉,可以看看我这篇博客:死锁知识点分享

     ⑥  公平锁和非公平锁

           公平锁和非公平锁相对好理解一点,就是是否遵循先来后到的原则.被男神拒绝之后(追我男神的人肯定超多),当男神想谈恋爱了,如果我跟他时间相处的更久,对他付出的最多,按照公平锁的规则,男神应该先跟我在一起,但是如果是非公平锁的话,就不一定是我了,追男神的女生都有平等机会和男神在一起.


2.cas是什么?aba问题是什么?如何解决?

     ① cas是什么

          cas全名compare and swap,即"比较和交换",它是CPU支持无锁的一条原子的且线程安全的CPU指令,它会比较内存A和寄存器B中的值是否相等,如果相等,就将内存A和寄存器C的值交换.

注:基于cas的操作实现有AtomInteger类,让++,--操作都线程安全,SpinLock类,反复检查当前锁释放被释放.

     ② aba问题

          cas指令只能判断寄存器B与内存A中的值是否相等,但是没办法判断寄存器B中的值是否发生改变.如果cas指令判断的是寄存器B已经修改后的值与内存A相等就可能会出现错误.我转账给朋友A,原本我账户有1000元,转账给朋友500应该剩500,刚开始线程A中的cas指令判断我还有1000块然后扣掉了我账户的500块,突然朋友B给我又转了500过来,我的余额又变成了1000,那么线程B的cas指令就判断出我的账户还是1000,又扣了我500,就相当于我被扣了两次钱.这就产生了aba问题.

     ③ 如何解决aba问题

         很简单,每次对要修改的值给它编个版本号,那么用cas指令除了判断寄存器中的值是否相等外,还要判断变量的版本号是否大于当前值的版本号,.才能执行对应操作.

在上述例子中,当线程B对我进行账户判断的时候,经历了一系列操作后,我当前的金额版本号肯定比它先前获取到的版本号要大,所以它是无法对我的账户进行扣款操作的.


3.synchronized的其它优化操作

     ① 锁消除

         简单的说就是非必要不加锁,比如说,在非多线程环境下,还不断进行加锁解锁操作(本身会浪费一定的资源)的话,这种资源浪费是没必要的,所以一般编译器和JVM都会判断锁是否可以消除,如果可用消除的话,就将锁消除.

     ② 锁粗化

          这个知识点涉及到锁的粒度,锁的粒度指synchronized修饰的代码块的代码量,一般都要求锁的粒度要尽可能的小(让串行执行的代码少一点,并行执行的代码就多一点),但是当没有其它线程来跟我们抢锁的时候,为了减少解锁用的时间,我们可以选择将锁粗化,将锁的粒度变大.

注:在前篇博客中分享了synchronized属于什么锁:synchronized学习大总结


分享完毕,有不对的地方欢迎大家一起学习指点一下我哦~

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

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

相关文章

PCB模块化设计04——USB-Type-C PCB布局布线设计规范

目录PCB模块化设计04——USB-Type-C PCB布局布线设计规范USB Type-C功能介绍信号图示Type-C接口引脚定义USB 2.0差分对电源和接地引脚RX和TX引脚CC1和CC2针脚VCONN引脚SBU1和SBU2针脚USB供电PCB设计布线要求PCB模块化设计04——USB-Type-C PCB布局布线设计规范 USB Type-C US…

STC的官网,是我永远忘不掉的炼丹炉

搞电子的,应该都搞过8051搞8051的,那应该都搞过STC在国内,STC已经成为了8051的代名词http://www.stcmcudata.com/如果你刚开始搞嵌入式,应该学单片机,你学习单片机,就应该学习下8051,学习8051&a…

Python+Pygame实现简单的单词小游戏

语言是一种艺术,但是作为语言的基础——词汇,却不像艺术那样赏心悦目。不断的记忆与复习,让词汇成为很多孩子在学习英语时,最难完全攻克的关卡。本文就来用Python制作一个简单的英语单词游戏吧 前言 语言是一种艺术,但…

【ArcGIS Pro二次开发】(17):打开GDB、SHP、CAD等各种数据

一、打开GDB数据库 // 输入一个数据库路径string gdbPath "C:\Users\Administrator\Documents\ArcGIS\Projects\Test\Test.gdb";await QueuedTask.Run(() >{// 如果文件夹存在并且包含有效的地理数据库,则会打开地理数据库。using (Geodatabase geoda…

【单片机/普中A2】学习笔记1-配置环境与STC-ISP烧录

目录前言连接到开发板micro-usb 测试安装串口驱动烧写准备源码烧录前言 目前我们的开发需求很简单,仅需三个软件: keli5 编写代码proteus8 professional 描绘电路板STC-ISP 串口烧录 具体教程在 CSDN 等博客平台上已经有很多,这里就不再赘述…

(排序2)希尔排序

写希尔排序注意: 写新元素融入有序数组的过程(end&tmp)将这个过程给多次类比到需要排序的一串数据中 (for&while)排完一组不够,需要排gap组 (再来for)敲定gap下标关系: 希尔排序与直接插入排序的区别与联系 希尔排序的话也叫做缩小…

刷题笔记【3】| 快速刷完67道剑指offer(Java版)

本文已收录于专栏🌻《刷题笔记》文章目录前言🎨 1、斐波那契数列题目描述思路一(递归)思路二(循环)🎨 2、跳台阶题目描述思路一(递归)思路二(循环&#xff09…

03-03 周五 镜像安装sshd和jupyter以及修改密码

03-03 周五 镜像安装sshd和jupyter以及修改密码时间版本修改人描述2023年3月3日15:34:49V0.1宋全恒新建文档 简介 由于在镜像中需要进行jupyter和sshd的安装,并且需要进行密码的修改,因此在该文档中记录了这两个交互方式的工程设计。 在线加密 在线加密…

Pycharm创建自定义代码片段

简介 PyCharm允许您创建自定义代码片段,也称为代码模板,以提高您的开发效率 实现步骤 1.添加代码模板 打开PyCharm并导航到File->Settings,或者按快捷键ctrl alt s 打开设置 ​ 按照如下序号步骤进行点击,点击“”按钮以…

基于canvas画布的实用类Fabric.js的使用Part.3

目录一、基于canvas画布的实用类Fabric.js的使用Part.1Fabric.js简介 开始方法事件canvas常用属性对象属性图层层级操作复制和粘贴二、基于canvas画布的实用类Fabric.js的使用Part.2锁定拖拽和缩放画布分组动画图像滤镜渐变右键菜单删除三、基于canvas画布的实用类Fabric.js的使…

gcc在Linux下如何运行一个C/C++程序

安装gcc:sudo apt-get install gcc(之后输入密码即可) 绝对路径的方式进入usr目录: cd /home /home/:是普通用户的主目录,在创建用户时,每个用户要有一个默认登录和保存自己数据的位置&#x…

【数据结构刷题集】链表经典习题

😽PREFACE🎁欢迎各位→点赞👍 收藏⭐ 评论📝📢系列专栏:数据结构刷题集🔊本专栏涉及到题目是数据结构专栏的补充与应用,只更新相关题目,旨在帮助提高代码熟练度&#x…

第14章_视图

第14章_视图 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某公司…

Python 自动化指南(繁琐工作自动化)第二版:六、字符串操作

原文:https://automatetheboringstuff.com/2e/chapter6/ 文本是程序将处理的最常见的数据形式之一。您已经知道如何用操作符将两个字符串值连接在一起,但是您可以做得更多。您可以从字符串值中提取部分字符串,添加或删除空格,将字…

【新2023Q2模拟题JAVA】华为OD机试 - 找数字 or 找等值元素

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:找数字 or 找等值元素 题目 …

华为OD机试 用java实现 -【重组字符串】

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:重组字符串 题目 给定一个非…

计算机网络 第一章 概述小结

计算机网络 第一章 概述 1.1 因特网概述 名词解释:因特网服务提供者ISP(Internet Service Provider) 1.2 三种交换方式 电路交换: 优点:通信时延小、有序传输、没有冲突、适用范围广、实时性强、控制简单&#x…

【美赛】2023年MCM问题Y:理解二手帆船价格(代码思路)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

新导则下的防洪评价报告编制方法及洪水建模实践技术

目录 1、《防洪评价报告编制导则解读河道管理范围内建设项目编制导则》(SL/T808- 2021)解读 2、防洪评价相关制度与解析 3、防洪评价地形获取及常用计算 4、HEC-RAS软件原理及特点 5、HEC-RAS地形导入 6、一维数学模型计算 7、基于数学模型软件的…

用 云GPU 云服务器训练数据集--yolov5

目录 为何使用云GPU训练我们数据集? 云服务器训练数据集教程: 1.创建实例 2.上传数据(OSS命令) 以下是oss的操作过程 训练模型时可能出现的报错: 为何使用云GPU训练我们数据集? 我们总是花费长达十几个…
最新文章