JUC总结3

CAS

简介

CAS的全称是“比较并交换”,是一种无锁的原子操作,其体现了乐观所的思想,在无锁的情况下保证线程操作共享数据的原子性。

CAS一共有3个值:

1、V:要更新的值;

2、E:预期值;

3、N:新值。

在比较和交换的过程中,需要比较V与E是否相等,若相等,则将V设置为N;若不相等,则说明有其他线程对共享变量进行了更新,当前线程应放弃。若CAS失败,则继续尝试获取新值,直至更新成功。

CAS底层实现

CAS底层是通过Unsafe类来直接调用操作系统底层的CAS指令,Unsafe类中的方法都是native方法,由系统提供接口实现,Unsafe类对CAS实现是通过C++进行的。

CAS存在的问题

ABA问题

ABA问题是指一个位置原来是A,后面被改为B,再后来又被改为A,进行CAS操作的线程无法知道在该位置的值发生过改变。

可通过加入时间戳或版本号的方式,解决ABA问题,在进行CAS操作时,需要值和版本号(或时间戳)均匹配时才能进行修改操作。在Java中,AtomicStampedReference类就实现了这种机制,它会同时检查引用值和stamp是否都相等。

循环性能开销问题

CAS在进行自旋操作时,若一直不成功,则会给CPU代理巨大的开销,可通过限制自旋次数来解决这个问题。

只能保证一个变量的原子操作

CAS只能保证对一个变量进行原子操作,当存在多个变量时,CAS无法直接保证对他们的原子操作。可通过以下两种方式解决:

1、考虑改用锁实现原子操作;

2、合并多个变量,将多个变量封装成一个对象,通过AtomicReference来保证原子性。

volatile

volatile的主要作用

保证变量在线程间的可见性

当一个线程修改某个变量的值时,volatile关键字会将修改的值刷新到主存中,该新值就对其他线程可见,对于volatile修饰的关键字,禁止使用JIT(即时编译器)进行优化。

禁止指令重排序

使用volatile修饰的变量,会在读、写共享变量时加上屏障,阻止其他读写操作越过屏障对共享变量进行读写操作。

对于volatile的写操作,会在其前后加上屏障,其中在写操作前的屏障,禁止前面的普通读操作与该写操作重排;写操作后的屏障,禁止后面的volatile读写操作与该写操作重排序,如下图所示:

对于volatile的读操作,会在其后面加上屏障,禁止后面的普通读写操作与重排序,该屏障强制让本地内存中的变量值失效,从而重新从主内存中读取最新的值,如下图所示:

对于volatile的写操作前的操作,不会被编译器重排到该写操作后;对于volatile的读操作后的操作,不会被编译器重排到该写操作前。

AQS

AQS是阻塞式锁和相关同步工具的框架,中文名为抽象队列同步器,它是构建锁或其他同步组件的基础框架。其思想是,若被请求的资源空闲,则线程申请该资源成功,反之该线程则进入一个等待队列,其他线程释放该资源时,系统随机选择一个在等待队列中的线程,赋予其资源。

AQS是悲观锁,通过Java实现,其开启和释放都需要手动进行,其工作机制是:

同步状态state由volatile修饰,保证其他线程对其可见,同时采用一个FIFO双端队列存储线程,如下图所示:

当线程要获取锁时,会尝试改变state的状态,若state状态为0,则可将其改为1,该线程抢占锁成功。若线程强制锁失败,则线程进入FIFO队列中等待。

AQS通过CAS自旋锁保证线程的原子性,保证每次只能有一个线程修改state成功。

AQS既可实现公平锁,又可实现非公平锁。当新来的线程与队列中的线程共同强资源时,该锁为非公平锁(如AQS实现类ReentrantLock),新来的线程进入等待队列中等待,只允许队列中head线程占用资源时,该锁为公平锁。

ReentrantLock

概述

ReentrantLock是可重入锁,其可中断、可设置超时时间、可设置公平锁、支持多个条件变量、支持重入。ReentrantLock主要利用CAS+AQS实现的,通过new ReentrantLock()创建的锁默认为非公平锁,要将其设置为公平锁,则应该通过有参构造函数的方式创建,并将变量设置为true(该变量设置为false时实现的非公平锁),代码:

//实现公平锁
ReentrantLock lock = new ReentrantLock(true);

构造函数如下图:

NonfairSync、FairSync的父类为Sync,Sync的父类为AQS。

加锁

调用lock()方法可实现加锁,unlock()方法实现解锁。在公平锁的条件下,锁会授予给等待时间最长的线程,在非公平锁的条件下,其加锁的方式如下:

当线程调用lock()尝试获取锁时,首先通过CAS方式修改state变量,若成功将其修改为1,则让exclusiveOwnerThread线程指向这个线程,该线程获取锁成功。若修该失败,则线程获取锁失败,则线程进入等待队列中。当exclusiveOwnerThread为null时,则持有锁的线程释放了锁,则会唤醒双向队列中在head位置的线程,公平锁和非公平锁的情况见上述AQS介绍。

为了实现锁的可重入,ReentrantLock内部有一个计数器跟踪线程持有锁的次数,当线程首次获取锁时,计数器的值变为1,如果同一线程再次获取锁,计数器增加;每释放一次锁,计数器减 1。当线程调用unlock()方法时,ReentrantLock会将持有锁的计数减1,如果计数到达0,则释放锁,并唤醒等待队列中的线程来竞争锁。

Synchronized和Lock对比

1、Synchronized是关键字,源码在JVM中,通过C++实现;而Lock是接口,源码由JDK提供,通过Java实现;

2、使用Synchronized时,退出同步代码块会自动释放锁,而使用lock时,需要通过unlock()释放;

3、两种都是悲观锁,支持互斥、同步、锁重入等功能;

4、相比于Synchronized,Lock支持获取锁状态、设置公平锁、可打断、可超时等,同时支持ReentrantLock、ReentrantReadWriteLock不同适合条件的实现;

5、在没有竞争时,Synchronized做了如偏向锁、轻量级锁等优化,但在竞争激烈时,Lock的性能更好。

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

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

相关文章

RHCE (Linux进阶) Ubuntu 操作系统安装教程

一、在官网下载iso镜像文件 下载地址: https://cn.ubuntu.com/download/server/step1#downloads(下载最新的Ubuntu 20.04 LTS服务器版本) 二、VMware安装配置过程 基本安装过程 1、新建虚拟机 2、选择典型即可 3、设置下载好的Ubuntu对应路…

Exception异常机制详细讲解

目录 一、异常1.1 什么是异常1.2 异常机制的作用1.3 常见的异常2.3 异常的分类1. Error2. Exception① 运行时异常② 编译期异常总结: 二、异常的处理2.1 抛出异常3.1 抛出异常语法3.2 试图捕获异常3.3 捕获异常与抛出异常的区别1. 抛出异常2.捕获异常 三、finally四…

Spring Cloud:构建高可用分布式系统的利器

摘要:本文将介绍Spring Cloud,一个基于Spring Boot的开源微服务架构工具集。我们将探讨Spring Cloud的核心组件、特性以及如何使用Spring Cloud构建高可用、分布式系统。通过本文,读者将了解到Spring Cloud在实现微服务架构中的应用和优势。 …

【Springcloud微服务】MybatisPlus下篇

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:Springcloud微服务 🌠 首发时间:2024年6月4日 🦋 欢迎关注🖱点赞👍收藏🌟留言&#x1f43…

24、matlab二维和三维网格(meshgrid函数)以及散点数据插值 griddata()函数

1、二维和三维网格(meshgrid函数) 语法 语法1:[X,Y] = meshgrid(x,y) 基于向量 x 和 y 中包含的坐标返回二维网格坐标。 语法2:[X,Y] = meshgrid(x) 与 [X,Y] = meshgrid(x,x) 相同,并返回网格大小为 length(x)length(x) 的方形网格坐标。 语法3:[X,Y,Z] = meshgrid(x,y,…

弘君资本炒股开户:如何看待股价波动?

在股票商场上股价的动摇无疑是投资者最为关心的话题之一,面临股价的起伏不定投资者往往会感到迷茫和焦虑。关于怎么看待股价动摇,弘君资本下面就为大家详细介绍一下。 股价动摇是股市运行的常态,股市是国民经济的晴雨表,股票价格…

SpringBoot+layui实现Excel导入操作

excel导入步骤 第三方插件引入插件 效果图 (方法1)代码实现(方法1)Html代码( 公共)下载导入模板 js实现 (方法1)上传文件实现 效果图(方法2)代码实现&#xf…

多语言大模型 Aya-23 开源!覆盖23种语言,性能刷新SOTA

文章目录 1. Aya-23 技术特点1.1 预训练阶段1.2 指令微调阶段 2. Aya-23 性能表现3. Aya-23 多语言任务评估4. Aya-23 支持 23 种语言5. Aya-23 应用场景 近年来,多语言大模型(MLLM)发展迅速,但大多数模型的性能依然存在显著差距&…

“滴滴打车,用友入账”,YonSuite商旅费控助力企业“降低成本”更进一步

在当今竞争激烈的商业环境中,企业对于成本控制和效率提升的需求日益迫切。特别是在商旅管理方面,如何有效整合资源、优化流程、降低费用,成为了成长型企业关注的焦点。用友YonSuite商旅费控作为用友集团旗下的重要产品,凭借其卓越…

ctfshow pwn17-18

毛坯的人生和精装的朋友圈 pwn17 while ( 1 ){menu();v4 0;puts("\nEnter the command you want choose:(1.2.3.4 or 5)\n");__isoc99_scanf("%d", &v4);switch ( v4 ){case 1:system("id");break;case 2:puts("Which directory?(/,…

卡尔曼滤波算法的matlab实现

卡尔曼滤波算法的matlab实现 figure; hold on;Z(1:1:100); %观测值:第一秒观测1m 第二秒观测两米 匀速运动, 每秒1m, 最后拟合的也是速度 1m/splot(Z); plot([0,100], [1,1]);noiserandn(1,100)*0.5; %生成方差为1的高斯噪声 ZZnoise; % 加入噪声plot(Z);X[0;…

LabVIEW动态力传感器校准系统

LabVIEW动态力传感器校准系统 开发了一种基于LabVIEW的动态力传感器校准系统。系统主要用于动态力的测量和校准,通过高度集成化和自动化的设计,显著提升校准的效率和精确度。系统采用冲击法进行动态校准,涵盖了完整的硬件设计和软件开发流程…

智能体应用开发:构建各类垂直领域的ai智能体应用

最近在做个类似的项目,有用到这方面的知识,顺便做一些记录和笔记吧,希望能帮到大家了解智能体应用开发 目录 引言 AI原生应用的兴起 智能体在AI中的角色 实现原理详解 机器学习基础 数据管理与关联数据库 数据结构 Embedding 检索方…

卫星位置解算

前言: 本章节代码均在Gitee中开源: 卫星位置计算代码https://gitee.com/Ehundred/navigation-engineering/tree/master/%E5%8D%AB%E6%98%9F%E5%AF%BC%E8%88%AA%E5%8E%9F%E7%90%86/GPS%E5%8D%AB%E6%98%9F%E4%BD%8D%E7%BD%AE%E8%A7%A3%E7%AE%97/Satellit…

心怀希望の光栅化

还记得什么是光栅化咩? 将三维空间的几何形体显现在屏幕上,这就是光栅化(游戏、实时图形学的应用) Perspective Projection 在正交投影里如何定义三维空间中的立方体呢? 用x轴的覆盖(左、右)…

【UML用户指南】-02-UML基本元素的介绍(二)

目录 1、语法和语义规则 2、UML中的公共机制 (1)规约 (2)修饰 (3)通用划分 (4)扩展机制 衍型/版型/类型(stereotype) 标记值 (tagged val…

Java编程常见问题汇总四

系列文章目录 文章目录 系列文章目录前言一、忽略所有异常二、重复包装RuntimeException三、不正确的传播异常四、用日志记录异常五、异常处理不彻底 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…

[C/C++]_[初级]_[在Windows和macOS平台上导出动态库的一些思考]

场景 最近看了《COM本质论》里关于如何设计基于抽象基类作为二进制接口,把编译器和链接器的实现隐藏在这个二进制接口中,从而使用该DLL时不需要重新编译。在编译出C接口时,发现接口名直接是函数名,比如BindNativePort,怎么不是_BindNativePort?说明 VC++导出的函数默认是使…

Google Earth Engine精度评价方法

今天讲讲如何在GEE中做最后的精度评价。主要是因为在和许多读者或通过交流群,或通过私聊沟通过程中,发现很多人还不是很理解在GEE中分类后精度评价的问题。 在进行评价之前,需要明晰在GEE中精度评价分为哪几种情况。我们这里说的是两种情况。…

收藏品NFT的开发流程

开发收藏品NFT的流程涉及多个阶段,从概念化和设计到技术实现和市场推广。以下是详细的开发步骤,通过这些步骤,可以成功开发和发布收藏品NFT项目,吸引用户和投资者,并确保项目的持续运营和成功。北京木奇移动技术有限公…