CAS 和 synchronized 优化过程

news/2024/4/20 15:53:22/文章来源:https://blog.csdn.net/m0_63101235/article/details/129128572

CAS:

CAS相对于计算器(count)++来说,count++在多线程的环境下是线程不安全的,那么就必须得加锁,而加了锁性能就会大打折扣,所以就有了CAS而CAS的操作是原子的,从而会保证线程的安全。本质操作是将线程A和内存里的数进行比较,如果相等则不会改变,如果不相等就会把线程B的值放在内存中,这里不考虑线程B的值为多少,只在乎内存的值是多少,而考虑到了CAS就会有一个ABA问题:

当我去银行给别人转账系统卡了我按了两下的取款操作,此时我有1000,然后我给别人转账500,然后我就剩了500,CAS的操作的话判断我之前的1000和之后只有500两个数不相等就不会出现问题,但是当我转账给别人500的时候,此时又有第三人给我转了500,那么我的金额就变回了原来的1000,此时的CAS操作不知道我的1000块是原来的1000还是别人修改的结果;

为了解决这个问题我们可以在弄一个内存记录线程的修改次数,当进行了一次修改那么就会+1,然后从这里开始比较的就是修改次数了,就不比较原来的值了

synchronized优化过程:

1.锁升级/锁膨胀:

synchronized在没有竞争的时候会变成一个偏向锁,这里的偏向锁没有加锁,只是一个状态

synchronized在有竞争的时候就会升级成为轻量级锁

synchronized在竞争激烈的时候就会变成重量级锁

这些都是JVM实现synchronized为了方便程序员的使用做出的优化

2.锁消除

当JVM发现程序的这个地方的代码没必要加锁,而此时如果你写上了synchronized,那么JVM就会自动帮你把锁消除掉。

当你的代码只有一个线程,或者有多个线程,但是多个线程不涉及修改同一个变量,但是你又加上了锁,那么JVM也会帮你自动去掉

针对与锁消除,只有在编译器/JVM认为有十足的把握才会消除,不然编译器/JVM也不会自动的消除

3.锁粗化

当synchronized对应包含的代码块内容比较多的时候粒度就比较粗,反之当synchronized包含的代码块少的时候,粒度就比较细。锁粗化的本质就是把细粒度的加锁转换成为粗粒度的加锁

好比如做工作一时加锁,做完了就解锁,然后在做工作二时加锁,做完了解锁,又开始做工作三时加锁,做完了就解锁,这些加锁虽然说是保证了线程的安全但是这里的顺序已经决定了不会影响线程,就会造成加锁解锁就会造成一些不必要的竞争,这样的一系列就称为锁的粒度比较细。

那么把细粒度加锁转换成粗粒度加锁就为:做工作一的时候加锁直到做完工作三时才解锁。

就好比给领导打电话汇报工作,锁的粒度比较细就是打一个电话汇报完第一个工作过后挂断,在打第二个电话汇报第二个工作持续这样。

而锁的粒度比较粗的情况下是:打电话给领导汇报工作一,工作二,工作三,结束电话。

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

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

相关文章

列表推导式_Python教程

内容摘要 Python中存在一种特殊的表达式,名为推导式,它的作用是将一种数据结构作为输入,再经过过滤计算等处理,最后输出另一种数据结构。根据数据结构的不同会被分为列表推导式、 文章正文 Python中存在一种特殊的表达式&#x…

2022年网络安全政策态势分析与2023年立法趋势

近日,公安部第三研究所网络安全法律研究中心与 360 集团法务中心联合共同发布了《全球网络安全政策法律发展年度报告(2022)》。《报告》概览2022年全球网络安全形势与政策法律态势,并对2023年及后续短期内网络安全政策、立法趋势进…

TCP状态详解

TCP Tcp wrappers : Transmission Control Protocol (TCP) Wrappers 为由 inetd 生成的服务提供了增强的安全性。TCP Wrappers 是一种对使用 /etc/inetd.sec 的替换方法。TCP Wrappers 提供防止主机名和主机地址欺骗的保护。欺骗是一种伪装成有效用户或主机以获得对系统进行未…

linux集群技术(二)--keepalived(高可用集群)(二)

案例1--keepalived案例2--keepalived Lvs集群1.案例1--keepalived 1.1 环境 初识keepalived,实现web服务器的高可用集群。 Server1: 192.168.26.144 Server2: 192.168.26.169 VIP: 192.168.26.190 1.2 server1 创建etc下的…

网上插画教学哪家质量好,汇总5大插画培训班

网上插画教学哪家质量好?给大家梳理了国内5家专业的插画师培训班,最新五大插画班排行榜,各有优势和特色! 一:国内知名插画培训机构排名 1、轻微课(五颗星) 主打课程有日系插画、游戏原画、古风插…

2023年测试人跳槽新功略,涨薪10K+

软件测试是如何实现涨薪的呢?很多人眼中的软件测试岗位可能是简单的,技术含量不是那么高,就是看看需求、看业务、设计文档、然后点一点功能是否实现,再稍微深入一点就是测试下安装部署时会不会出现兼容性问题,以及易用…

技术学习-消息队列

什么是消息队列 可以简单理解为存放消息的队列,数据结构模型和队列一样,都是先进先出。主要用不同线程(Thread)/进程(Process) 为什么需要消息队列 (1)不同进程之间传递消息是,因为进程的耦合度高,改动一个进程,引发…

npm 上传自己的包

mkdir demo 创建一个新的文件夹 npm init 初始化项目 生成一个package.json文件 name version description等等touch index.js 创建一个node 可执行脚本新的js 文件 #!/usr/bin/env node // 必须在文件头加如上内容指定运行环境为node console.log(hello cli)在package.json 中…

【教程】GitStats代码统计工具(附GitLab API相关)

使用GitStats进行代码统计 官方文档:GitStats - git history statistics generator GitStats是基于Git的数据统计生成器,输出格式为HTML,可直接在浏览器打开查看,展现为图表形式的可视化数据,内容包括: 常…

图像识别技术解析:手写数字识别(一)

本文通过构建一个手写数字识别的程序来解析来自机器学习与深度学习的不同算法的特点,以及如何对识别效果进行改进。 一、如何构建一个手写数字识别程序 首先可以考虑构建一个简单的页面用于用户输入,也就是前端;接下来需要准备一个后端用于…

mac 好用的类似Xshell工具

下载royal TSX 5.1.1 http://share.uleshi.com/f/9490615-685692355-33bf1e修改mac的etc/hosts文件权限访达(鼠标右键) -> 前往文件夹 ->输入/private --> 打开etc/hosts --> 显示简洁(鼠标右键) --> 权限改成读和写hosts文件写入如下内容:# Royal T…

空间直线方程及其与面线的夹角

一、空间直线的方程 1.1 空间直线的一般方程 空间直线 LLL 可以看做是两个平面 Π1\Pi_1Π1​ 和 Π2\Pi_2Π2​ 的交线,那么就可以用两个平面方程来表示这个直线: {A1xB1yC1zD10A2xB2yC2zD20(1)\left\{ \begin{aligned} A_1xB_1yC_1zD_10\\ A_2xB_2yC…

卷起来了,2023金三银四自动化测试面试题精选【字节二面】

面试一般分为技术面和hr面,形式的话很少有群面,少部分企业可能会有一个交叉面,不过总的来说,技术面基本就是考察你的专业技术水平的,hr面的话主要是看这个人的综合素质以及家庭情况符不符合公司要求,一般来…

Office 365 备份与恢复

Microsoft Office 365中的不同服务几乎可以随时访问,这要归功于Microsoft的99.9%正常运行时间记录。但是,Office 365步履蹒跚的一个方面是提供了一种从意外数据丢失中恢复的方法。Microsoft 提供的数据保留功能并非适用于所有数据丢失情况的可行解决方案…

简述操作系统的文件系统

前言 文件系统是操作系统中负责管理持久数据的子系统,将用户的文件保存在硬盘等硬件设备中,即使断电了数据也不会丢失。 对于用户而言,文件是存储的最小单位,再少的数据也需要以文件的形式存储在外部存储器中。以硬盘为例&#…

FLV-初学总结

FLV-初学总结 从零开始仅学习了一下午的总结,本文非常稚嫩… 本文为纯初学者的学习记录,为了方便理解,内容未必严谨,可以用作纯新手的入门了解篇。本文主要的参考链接如下⬇️ 详细了解FLV:FLV官方文档(Ve…

论文解读 | [CVPR2019] 基于自适应文本区域表示的任意形状场景文本检测

目录 1 研究背景及意义 2 总体设计 3 方法论 3.1 自适应文本区域表示 3.2 文本建议 3.3 建议改进 4 损失函数 5 实验及结果 1 研究背景及意义 现有的场景文本检测方法使用固定点数的多边形来 表示文本区域。例如,水平文本使用2个点(左上/右下)表示文本区域&…

VR全景带你打卡《狂飙》经典取景地!

热度“狂飙”!电视剧《狂飙》的取景地——江门墟顶老街人气火爆,720VR全景带您了解,这个具有新活力的老街区,蛙色3DVR提供技术支持!通过航拍VR全景,全方位展示江门历史文化街区,720浏览&#xf…

【Java基础】反射

概述 引入 package ref;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.r…

Revit项目浏览器的标准设置应用和快速视图样板?

一、Revit项目浏览器的标准设置应用 设计院阶段的BIM应用,主要是Revit出施工图方面,需要涉及到很多标准的制定方面的问题,而且这个标准不仅仅是一个命名标准,还有很多的符合本院的出图标准等等,本期就不做详细讨论&…