Java语法五:锁策略以及CAS

news2024/11/18 1:43:34

目录

 

1.常见的锁策略

2:Synchronized原理

2.1:加锁工作工程

2.2:其他的优化操作

2.2.1:锁消除

2.2.2:锁粗化

3.CAS

3.1:实现原子类

3.2:CAS中的ABA问题

3.2.1:什么是ABA问题

3.2.2:存在的BUG问题。

3.2.3:解决办法


1.常见的锁策略

1.乐观锁vs悲观锁

乐观锁:预期锁冲突的概率很低。乐观锁认为别的线程不会同时修改数据,所以不会上锁。

悲观锁:预期锁冲突的概率很高。每次去拿数据的时候,认为别的线程也会同时修改数据,所以每次拿数据的时候都会上锁。

 

2.读写锁vs互斥锁

读写锁:

加读锁:如果代码只进行读这个操作,就加读锁。

加写锁:如果代码只进行修改这个操作,就加写锁。

解锁:

针对读锁和读锁之间,是不存在互斥关系,读锁和写锁,写锁和写锁才存在互斥关系。

读写锁特别适合于"频繁读,不频繁写"的场景中。

互斥锁

互斥锁只有加锁和解锁这两个步骤,只要两个线程对同一个对象加锁,就会产生互斥。

 

3.重量级锁vs轻量级锁

重量级锁:做了更多的事情,开销也很大。加锁机制重度依赖了OS提供了mutex。通常情况下,悲观锁一般是重量级锁。

轻量级锁:做了较少的事情,开销也比较小。加锁机制尽可能不适用mutex,而是尽量在用户态代码完成,如果实在搞不定,再使用mutex。

 

4.挂起等待锁vs自旋锁

挂起等待锁:当莫个线程没有申请到锁的时候,此时该线程会被挂起来,即加入到等待队列中等待,当锁释放的时候,就会被唤醒,重新竞争锁。往往通过内核的一些机制来实现的。这是重量级锁的一种体现。

自旋锁:当莫个线程没有申请到锁的时候,该线程不会被挂起来,原地转圈圈,每隔一段时间来检测锁释放被释放,如果锁被释放了,那就竞争锁;如果没有释放,过一会儿再来检测。一旦锁被其他线程释放,就能第一时间获取到锁。

自旋锁是一种典型的轻量级锁的实现方式。

优点:没有放弃cpu,不涉及线程阻塞和调度,一旦锁被释放,就能第一时间获取到锁。

缺点:如果锁被其他线程持有的时间比较久,那么就会持续的消耗cpu资源,(而挂起来等待的时候是不消耗cpu的).

 

5.公平锁vs非公平锁

公平锁:是遵循先来后到(多个线程在等待一把锁的时候)。

非公平锁:是不遵循先来后到(多个线程在等候一把锁的时候,获取到锁的概率是均等的。)

 

6.可重入锁vs不可重入锁

针对同一个锁对象连续锁两次,不会产生死锁,那就是可重入锁,会产生死锁,那就是不可重入锁。

2:Synchronized原理

1.是一个乐观锁,也是一个悲观锁(根据锁竞争的激烈程度,自适应)。

2.不是读写锁,只是一个普通互斥锁。

3.是一个轻量级锁,也是一个重量级锁(根据锁竞争的激烈程度,自适应.)

4.轻量级锁的部分属于自旋锁来实现,重量级的部分基于挂起等待锁来实现。

5.非公平锁。

6.可重入锁。

2.1:加锁工作工程

b8dfba3eef5148a3a42513834075cd23.png

1)偏向锁: 

首个线程加锁,就会进入偏向锁状态。偏向锁不是真的“加锁”,只是做了一个标记。偏向锁本质上相当于“延迟加锁”,能不加锁就不加锁,尽量来避免不必要的加锁开销。但是该做的标记还是的做,否则无法区分何时需要真正的加锁。

这样的好处:就是后续如果没有其他线程竞争的时候,就不加锁,避免加锁带来的解锁。

偏向锁:主要用来优化同一个线程多次申请同一个锁的竞争

举一个例子:

我是一个渣男,看见了一个漂亮的女孩,想让她做我女朋友,但不想最后我不和她好的时候,她不跟我分手(跟这个女孩解锁),所以我决定搞暧昧,我和她假装是男女朋友,但实则我并没有给这个女孩表白,但一旦有其他男孩追这个女孩,我就立马表白,给这个女孩进行加锁。

2.2:其他的优化操作

2.2.1:锁消除

在单线程的时候,就不用使用锁,利用你使用了StringBuffeer Vector这个在标准库中进行了加锁,这时候编译器+JVM会自己判定锁是否可以给消除,如果可以,就直接消除。

2.2.2:锁粗化

这里的粗化,加锁的范围扩大。

锁的粒度越细,多个线程之间的并发度越高,加锁和解锁的开销也就越大。

public static void main(String[] args) {
        Object lock=new Object();
        Thread t=new Thread(()->{
            for (int i=0;i<10;i++){
                synchronized (lock){//锁细化
                    System.out.println(i);
                }
            }
        });
        Thread t1=new Thread(()->{
            synchronized (lock){//锁粗化
                for (int i=0;i<10;i++){
                    System.out.println(i);
                }
            }
        });
        t.start();
        t1.start();
    }

3.CAS

CAS:全称:Compare and swap。意思就是比较并交换。

我们假设线程中cpu中的数据为V,内存中的旧数据为P,要修改的数据为B。

1.要比较P 和V 是否相等。(比较)

2.如果相等,就将B写入到P里面(交换)

3.返回操作是否成功。

3.1:实现原子类

public static void main(String[] args) throws InterruptedException {        
    AtomicInteger num=new AtomicInteger(0);                                 
    Thread t=new Thread(()->{                                               
        for (int i = 0; i <5000 ; i++) {                                    
                  num.getAndIncrement(); //num++;                           
        }                                                                   
    });                                                                     
    Thread t1=new Thread(()->{                                              
        for (int i = 0; i <5000 ; i++) {                                    
             num.getAndIncrement();                                         
        }                                                                   
    }) ;                                                                    
    t.start();                                                              
    t1.start();                                                             
    t.join();                                                               
    t1.join();                                                              
    System.out.println(num.get()); //这个方法可以得到原子类内部的数值                       
}                                                                           
                                                                            
                                                                            

 

212f7f0f894c4643834c0dc3a6a6965e.png

 


3.2:CAS中的ABA问题

3.2.1:什么是ABA问题

假设存在两个线程 和 t1,有一个共享变量 num。初始值为10

线程 想使用CAS把num的值改为20。但是在这期间。t1 线程把num的值改成15,之后又改成10。

那么这时候线程 是否要更新num的值为20(线程 的num的值是否和内存num的值相等)

3.2.2:存在的BUG问题。

假如当你要向别人付款50元,你只有100元,由于网卡,你第一次点击确认没有反应,你又点击了一次。这时候生成了两个线程,当线程一完成付款的时候,你剩余50元,线程二在阻塞等待,这时候,你的好伙伴给你转账50元。你余额100。当线程二,拿自己线程中的值和内存的值进行比较相等,又扣除50。这样你就扣除了两次。

3.2.3:解决办法

给要修改的值,引入版本号。在CAS比较数据当前值和旧值的同时,也要比较版本号是否符合预期。

1.CAS操作在读取旧值的同时,也要读取版本号。

2.如果当前的版本号和读取的版本号相同,则修改数据,并将版本号加一。

3.如果当 前的版本号要低于读取的版本号,则操作失败。

88f5c5a73ad449d5b519188bd630255f.png

线程二最后读取的value值相同,但版本号不同。所以线程二操作失败。 

总结:

以上就是我总结的锁的相关知识和CAS的相关问题,若有错误之处,请留言纠错,若感觉不错。请一键三连。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaScript】俄罗斯方块简单网页版

文章目录js制作简单网页版俄罗斯方块效果演示设计思路一、HTML网页结构代码二、CSS代码三、JS代码四、代码资源分享js制作简单网页版俄罗斯方块 程序虽然很难写&#xff0c;却很美妙。要想把程序写好&#xff0c;需要写好一定的基础知识&#xff0c;包括编程语言、数据结构与算…

在mac上搭建php的SNMP开发环境

前言 最近需要开发AC的snmp协议&#xff0c;需要开启php的snmp扩展&#xff0c;网上能搜索到的主要还是windows和centos下面的几篇资料。这里主要介绍下mac系统下如何搭建php的snmp开发环境。 第一步&#xff0c;安装php&#xff1a; 首先需要在mac上面安装PHP&#xff0c;这…

重点物联网漏洞利用情况

重点物联网 漏洞利用情况本节我们选取了两个漏洞进行分析。UPnP 相关的漏洞我们将在 4.4.3 进行分析&#xff0c;除去 UPnP 相关漏 洞外&#xff0c;被利用最多的是 Eir D1000 路由器的一个漏洞 [44]&#xff08;CVE-2016-10372&#xff09;&#xff0c;我们将对其进行分析。 …

第006课 - 使用vagrant快速创建linux虚拟机

使用vagrant快速创建linux虚拟机 项目中使用的环境,都是装在linux当中的,我们可以使用linux虚拟机。 https://www.virtualbox.org/ 直接双击进行安装运行。 CPU开启虚拟化 virtualbox安装需要我们的cpu开启虚拟化。 这个需要设置主板。 在开机启动的时候,找到cpu配置:…

什么是金手指,金手指的设计要求有哪些?

金手指&#xff08;connecting finger&#xff09;是电脑硬件如&#xff1a;&#xff08;内存条上与内存插槽之间、显卡与显卡插槽等&#xff09;&#xff0c;所有的信号都是通过金手指进行传送的。金手指由众多金黄色的导电触片组成&#xff0c;因其表面镀金而且导电触片排列如…

阿里云主要产品架构介绍

文章目录前言主要产品云产品访问拓扑ECS架构RDS架构OCS架构SLB架构OSS架构OTS架构ODPS架构SLSSLS的产品视角SLS运维视角OAS结语前言 阿里云产品众多&#xff0c;基本涵盖了从存储到计算到网络的方方面面&#xff0c;当然还包括大数据和人工智能。这些产品&#xff0c;共同组成…

响应式原理 之 vue2 vue3

目录 一、响应式概念 二、响应式函数的实现 watchFn 三、响应式依赖的收集 四、监听对象的变化 1. vue2 2. vue3 五、对象的依赖管理 1. 图解 2. 代码 六、响应式完整代码 一、响应式概念 m有一个初始化的值&#xff0c;有一段代码使用了这个值那么在m有一个新的值时…

热门探讨丨SaaS软件是否正在“毁掉”数字化转型企业?

——当它浮出水面&#xff0c;才能看到水下的错落。 截至2021年末&#xff0c;我国企业的数量达到4842万户&#xff0c;增长1.7倍&#xff0c;其中99%以上都是中小企业。 根据调查&#xff0c;在数字化转型浪潮中&#xff0c;我国有超过70%的企业对数字化转型处于积极态度&am…

网络部署运维实验(pat 端口映射含命令)

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;疫情之下&#xff0c;你我素未谋面&#xff0c;但你一定要平平安安&#xff0c;一 起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;…

Vue JSX 上手指南

JSX 简介 JSX Javascript XML。在 Javascript 里写 XML&#xff0c;同时拥有 Javascript 的灵活性和 HTML 的语义化。 Template vs JSX template 是 Vue 的默认写法&#xff0c;也更推荐。因为 template 语法是固定的&#xff0c;Vue 在编译层面为它做了很多静态标记的优化…

MySQL简介及常用引擎介绍

MySQL 由 My 和 SQL 组成&#xff0c;其中的 SQL 部分即为&#xff1a;Structured Query Language&#xff0c;意为结构化查询语⾔&#xff0c;是访问数据库的最常⻅的标准化语⾔。 MySQL 是一款优秀的、开源的数据库管理系统&#xff0c;同时 MySQL 也是一款可移植的数据库&a…

【WSL】[02] windows subsytem linux 配置和使用

第【2】章前言&#xff1a; 上一篇我们已经安装好了ubuntu在WSL下的GUI的桌面&#xff1a;我们现在继续进一步进行配置工作。同时也把&#xff0c;运用WSL的流程摸一把&#xff0c;以备后用。 1 在windows的PowerShell终端进行配置和查询&#xff1a; 1.1 查询所有支持的可以…

极小尺寸,超低功耗,高度集成,天翼物联NB-IoT云芯模组

数字经济时代&#xff0c;物联网已融入我们的日常生活。比如&#xff0c;智能抄表代替人工上门抄表&#xff0c;运动手环实时传输心率情况&#xff0c;烟感报警器远程告警……这些高科技背后都有一颗小而强大的芯片在支撑。 天翼物联云芯模组依托天翼物联网平台&#xff08;AIo…

制造业项目管理软件如何帮助企业做好项目管理?

项目产品、采购、销售、BOM变更管理不全面&#xff1b; 项目进度追踪管理难&#xff1b; 项目进度款管不清、项目尾款管不到&#xff1b; … … 而以上仅仅是生产制造企业所面临的项目管理问题的“冰山一角”。 采用“项目制”生产模式的制造企业&#xff0c;需要做到项目…

理解XaaS(SaaS、Baas、Paas、Iaas)

XaaS : XX as a Service 参考原文 以电商来举例 一套电商系统需要的开发资料 产品经理&#xff1a;设计电商系统 前端工程师&#xff1a;开发页面 后端工程收&#xff1a;开发后端 运维工程师&#xff1a;搭建环境&#xff0c;部署到服务器&#xff0c;负责后期维护等 服务器…

指南解读:急性心力衰竭中国急诊管理指南(2022)

心力衰竭&#xff08;heart failure&#xff0c;HF 简称心衰&#xff09;是由于心脏结构和 / 或功能异常导致心室充盈和/或射血能力受损的一组临床综合征&#xff0c;其病理生理学特征为肺淤血和/或体循环淤血、伴或不伴有组织器官低灌注&#xff0c;主要临床表现为呼吸困难、乏…

美容门店信息化管理系统该如何搭建?不妨参考一下百数

随着人们的生活水平越来越高&#xff0c;人们在解决了温饱问题之后有了更多的追求。其中美容正在成为不少人新的必做项目&#xff0c; 迎合了人们对于爱美的需求。目前我国美容机构市场规模已超过4500亿元&#xff0c;行业从业人员超过3000万。据国家工商联统计数字显示&#x…

JS_fetch请求数据

1、axios 比如常用的需求中&#xff0c;想要请求A接口的数据再去请求B接口的数据&#xff0c;axios的做法是需要先请求A接口&#xff0c;然后在A接口的成功的回调函数里面去请求B接口。 fetch使用的情况并不多&#xff0c;主要是由于存在兼容性问题&#xff0c;在企业中就不会…

南大通用数据库-Gbase-8a-学习-29-常用函数介绍

一、测试环境 名称值cpu12th Gen Intel Core™ i7-12700H操作系统CentOS Linux release 7.9.2009 (Core)内存3G逻辑核数2Gbase-8a数据库版本9.5.3.27 二、函数介绍 1、HEX &#xff08;1&#xff09;说明 将数字或字符串转换成十六进制形式。 &#xff08;2&#xff09;例…

2022年我去过最喜欢的16座城市

欢迎关注「苏南下」分享我的旅行、摄影心得感悟2022 年我去了 16 个城市地区&#xff0c;拍了 40条旅行短片。又是很久没更新&#xff0c;2022 年过得好快&#xff0c;马上就是 2023 了。如果用一个关键词来总结我这一年&#xff0c;我觉得可以是&#xff1a;运气好。从年初 1 …