[09]从零开始的JAVAEE-CAS

千锋Java高级教程+分布式+springcloud+微信支付课程 课程目录: ├─千锋Java高级教程-cas单点登录(完结-8集) │ 01单点登录介绍 │ 02cas介绍 │ 03tomcat搭建https │ 04cas server搭建 │ 05Cas 配置 jdbc 连接数据库 │ 06Cas 密码 MD5值 │ 07 Cas 整合shiro1 │ 07 Cas 整合shi... 阅读详情

目录

一、什么是CAS

CAS的特性

实现原子类

使用方法:

实现自旋锁

CAS的aba问题

如何解决


一、什么是CAS

CAS(compare and swap)是一个和多线程密切相关的东西,它会比较寄存器A和内存M中的数据,如果相同,就交换寄存器B和内存M中的数据

CAS是多线程编程中无锁编程的重要组成部分,CAS的存在使得并发编程不需要加锁也可以实现线程安全。

CAS的实际作用,就是多个线程修改同一变量的时候,在修改时确认一下当前变量是不是已经被别的线程修改过,如果修改过了,就读取被修改过的新的变量之后在进行新的修改操作。

还记得线程安全那篇博客里关于两个线程自增5万次的典型案例吗,不使用CAS,就会导致线程不安全,使用CAS,就可以避免这个问题

CAS的特性

CAS是一条CPU指令,也就说,CAS是具有原子性的

基于CAS可以实现很多操作

实现原子类

伪代码实现:

 这里的oldValue是一个寄存器,在CAS指令中,如果发现value和oldvalue值相同,就使得oldValue自增然后赋值给value,执行完毕会返回一个true,如果不相同,不会执行并且返回false。

value是一个成员变量,虽然在getAndIncrement()方法中将value的值赋给了oldValue,但是由于cpu的无序调度,很有可能会导致此时CPU调度走,value的值被别的线程修改了,所以CAS再次进行比较,以这种方式保证了线程安全。

标准库中提供了很多原子类

 这些原子类,可以保证多线程自增自减时的线程安全

使用方法:

  • getAndIncrement():后置++
  • incrementAndGet():前置++
  • getAndDecrement():后置--
  • decrementAndGet():前置--
    public static void main(String[] args) throws InterruptedException {
        AtomicInteger num = new AtomicInteger(0);
        Thread t1 = new Thread(()->{
            num.getAndIncrement();//num++;
            System.out.println(num.get());
            num.incrementAndGet();//++num
            System.out.println(num.get());
            num.decrementAndGet();//--num;
            System.out.println(num.get());
            num.getAndDecrement();//num--;
            System.out.println(num.get());
        });
        t1.start();
    }
}

使用原子类就可以保证线程安全了,还是以前文中两个线程自增5w次为案例

public class work3 {
    public static void main(String[] args) throws InterruptedException {
        AtomicInteger num = new AtomicInteger(0);
        Thread t1 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                num.getAndIncrement();
            }
        });
        Thread t2 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                num.getAndIncrement();
            }
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(num.get());
    }
}

结果为

实现自旋锁

伪代码:

 这里的owner是记录当前的锁被哪个线程持有,在lock()中,如果当前线程的锁为空,则将owner设置为当前线程的锁。

CAS的aba问题

CAS关键是对比内存和寄存器中的值是否相同,通过这个对比来检测内存是不是改变过。

但是万一对比的时候相同,但实际上这个值变过,是从a->b->a,看似没变过,实际上变过,就会有一定的概率出现问题。

如何解决

CAS只能对比值是否相同,是无法确定这个值是否改变过的,因此,解决问题的方法就在数据的变化:如果约定数据只能单方面变化,就可以解决这个问题,即数据只能增加,或只能减小。

或者引入版本号:版本号只能增加\减少,但版本号所对应的数据可以随意改变

Matlab实战:3种雷达间歇采样干扰的仿真与识别(附完整代码) 本文通过Matlab实战,详细仿真了雷达有源间歇采样干扰的三种核心样式:直接转发、重复转发和循环转发干扰。文章提供了完整的代码实现,并深入探讨了基于时频分析和循环平稳分析的特征提取与识别方法,为雷达抗干扰技术的学习与实践提供了清晰的工程实现路径。 阅读详情

相关推荐

低功耗基础概念——Level Shifter cell补充

信号跨越不同级别电压模块进行驱动时,需要使用level shifter。 H2L Level shifer 从高电压到低电压的level shifter,可以是两个反相器的串联。 输入高电平区域信号INH,输出低电平区域信号OUTL,注意供应电源由低电压模块提供,即图中的VDDL。 从图中可以看出,H2L的level shifter只会引入一个buffer的延迟,对时序的影响较小。 L2H Level shifer 用低电压区域的信号invert和buffer之后得到的一对信号来驱动工作在高电压区域的交

qq_36480087的博客 1万+

【JavaEE】——CAS指令和ABA问题

CAS指令,伪代码,原子类,CAS中ABA问题,CAS底层分析

阿华的博客 1685

使用Transformer实现自动调制识别(RML2016a)

image_size = 128 # resize重置输入大小patch_size = 2 # 从输入图片(信号看作图片)中将被提取的块大小# 分成 num_patches 个块num_patches = (image_size // patch_size) #(72/6)**2 横着裁剪),],return x)(x1, x1)# MLP.# Add MLP.x=x_train,y=y_train,filepath,round。

QAQIknow的博客 6276

JavaEE 09 锁策略

锁策略

qiuqiushuibx的博客 1425

2018安徽省青少年信息学奥林匹克(AHOI)初中组

12 种合法的排列分别为:1, 3, 2, 4, 2, 3, 1, 4, 3, 1, 4, 2, 3, 2, 4, 1, 1, 3, 4, 2, 2, 3,4,1,1,4,2,3, 2,4,1,3, 4,1,3,2, 4,2,3,1, 1,4,3,2, 2,4,3,1。分为 2 组,一组的队员实力值是{4, 5, 2, 3},一组是{-4, -3, -5},其中最小的组人数为 3,可以发现没有比 3 更优的分法了。[0, 1, 1, 2]同样不是合法的分组方案,因为出现了两个实力值为 1 的选手。

weixin_42358969的博客 1143

深度学习中常用的几种卷积(下篇):膨胀卷积、可分离卷积(深度可分离、空间可分离)、分组卷积(附Pytorch测试代码)

膨胀卷积也称为扩张卷积或空洞卷积,一般可通过对标准二维卷积的卷积核设置合适的膨胀率(具体地指卷积核元素之间的距离)实现。合理利用膨胀卷积可在不引入其他参数的同时,扩大输出中元素的感受野,提高特征的全局表示能力。下面通过展示几个不同膨胀率下的卷积核大小以及感受野变化情况,可以更直观的理解:图中灰色为输入,蓝色为卷积核,黄色为输出。1)dilation=1:表示卷积核元素之间距离为1,使用0进行大小为dilation-1=0的填充(这是默认情况),因此。

NorthSmile的博客 9018

java cas logout无效_java – CAS单点注销无效

我正在通过CAS在Java EE环境中实现单点登录单一注销.在身份验证方面,我有cas-server-webapp v4.0.1.然后是2个简单的Java Spring MVC web应用程序和cas-client-corev3.1.10.没有关于单点登录的问题.如果我访问/ app1,我将被重定向到cas-server-webapp中的cas登录页面.用户传递输入后,我被重定向到/ app1正确...

weixin_39840235的博客 491

学 Simulink—— 基于储能系统(BESS)并网逆变器的 削峰填谷(Peak Shaving & Valley Filling)功能仿真

本文详细介绍了基于储能系统(BESS)并网逆变器的削峰填谷功能Simulink仿真方法。主要内容包括:1)削峰填谷原理与典型日负荷曲线控制逻辑;2)简化系统拓扑与关键参数设置;3)分步骤建模过程,重点讲解EMS控制逻辑、SOC模型和PQ控制实现;4)典型仿真结果分析及参数调优建议;5)常见问题解决方案和工程扩展方向。通过该仿真可掌握BESS在用户侧储能、虚拟电厂等场景的核心应用,实现电网侧功率按峰谷时段规划、BESS充放电控制及并网逆变器PQ控制。文章还提供了完整的BESS/微网系列课程框架和混合微网系统进

xiaoheshang_123的博客 42

JavaEE 第14节 深入探讨CAS:原理、应用、ABA问题及其解决办法

从当下的计算机使用环境来看,单线程程序难以满足高性能和高吞吐量的需求,而并发编程允许多个线程执行任务,有效减少等待和资源闲置。传统锁机制中,上锁和解锁的开销本身比较大,并且可能存在死锁问题。ABA问题是CAS的一个小小瑕疵。因为在特定场合才会出现这种问题,并且这种问题出现的概率非常的小。具体为什么,来看下面的解释。刚才我们在讲CAS实现原子操作的步骤中强调过,必须先判断寄存器1的值和高速缓存中的值是否相同,相同才能重新对高速缓存中的值进行修改。ABA问题实际上就出现在上面这步上。

HYY的博客 1086

CMake入门教程【基础篇】在Windows、Linux上安装CMake

CMake如何下载与安装

小鱼酱的博客 2727

AUTOSAR汽车电子嵌入式编程精讲300篇-基于加密算法的车载CAN总线安全通信

随着科学技术的不断更新和社会文明的不断进步,汽车已经走入寻常百姓家, 成为当代社会必不可少的交通工具。伴随着互联网技术的飞速发展,汽车也不再 是一个简单的交通工具,已经逐渐发展成为一个集出行、通信、娱乐等功能于一 身的综合智能体,进而推动了车联网产业的蓬勃发展。车联网是在传统汽车的框架上安装了传感器、执行器、控制器等分布式和集 中式控制器,使汽车具备环境感知、协同控制、优化执行等功能,并通过网络技 术实现与车外环境的信息共享,给驾驶带来方便的同时也终将成为可以替代人操 作的新一代汽车[1-3]。

getusushu的博客 2591

【JavaEE -- 多线程进阶 - 面试重点】

多线程常见锁策略、CAS、synchronized原理、callable接口、ReentrantLock、信号量Semaphore、CountDownLatch、ConcurrentHashMap

m0_63440113的博客 2110

AUTOSAR CP R18-10 架构总览与导航

AUTOSAR CP R18-10 架构总览 本文档系统整理了AUTOSAR CP R18-10版本的199篇技术规范,涵盖7大架构层级: 应用层(15篇):包含车身舒适、底盘控制、HMI、安全系统、动力系统等AI应用 RTE(1篇):虚拟功能总线规范 服务层(159篇):细分为系统服务(OS/ECU管理/加密)、存储服务、通信服务(CAN/LIN/Ethernet) ECU抽象层(20篇):I/O与通信硬件抽象 MCAL(41篇):微控制器驱动层 复杂驱动(14篇):CDD设计与SPAL支撑 规范模板(2

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 724

cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题

博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 活动 招聘 ITeye GitChat     写博客 赚零钱 传资源 关注和收藏在这里 文章评论 写评论 dazhangfengxiao#6楼 亲测可用,谢谢! 3个月前 l714417743#5楼 cas4.0测试无效,还是自己尝试重写吧 3个月前 zhanf...

u013452335的博客 4990

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

[JavaEE] 常见锁策略、自实现定时器

本文介绍了Java多线程编程中的关键概念:1.锁策略分类(乐观/悲观锁、重量级/轻量级锁、自旋/挂起等待锁等);2.synchronized原理(锁升级机制:偏向锁→轻量级锁→重量级锁)及优化(锁消除、粗化);3.CAS操作原理及ABA问题解决方案;4.定时器实现方案(基于优先级队列和轮询线程)。文章深入浅出地讲解了这些并发编程核心技术点的实现原理和使用场景。

Miraitowa_cheems的博客 1031

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

MyEclipse调试cas源程序 无​需​m​a​v​e​n​ ​j​a​v​a​版​本 全过程详解,含server端、client端、tomcat配置

看了很多关于sso-cas的源代码调试过程,但是自己做的时候,发现都不全面,自己决定做一个全面的

mmayanfa的专栏 1465

java 认证框架_java 框架介绍------权限框架

OSSOJOSSO(JavaOpen Single Sign-On)是一个开源的J2EE-based的SSO(SSO:单一登录技术是一种认证和授权机制,它允许注册用户只需要在任一成员网站上登录一次,而后授权访问其他连接的分支网站,无需再进行验证登录)基础结构.它的目的是提供一种用来解决在统一平台上进行用户集中认证的方案.Acegi SecurityAcegi Security为Sp...

weixin_42210284的博客 542

JAVAEE工程师-2年经验-个人简历

2年Java开发工程师简历-模板 2年Java开发工程师简历-模板2年Java开发工程师简历-模板2年Java开发工程师简历-模板2年Java开发工程师简历-模板2年Java开发工程师简历-模板2年Java开发工程师简历-模板2年Java开发工程师简历-模板2年Java开发工程师简历-模板2年Java开发工程师简历-模板2年Java开发工程师简历-模板2年Java开发工程师简历-模板2年Java开发工程师简历-模板2年Java开发工程师简历-模板2年Java开发工程师简历-模板2年Java开发工程师简历-模

专业的计算机毕业设计指南 1181

重大升级,MaxKey单点登录认证系统v3.5.7GA发布

MaxKey单点登录认证系统,谐音马克思的钥匙寓意是最大钥匙,是业界领先的IAM身份管理和认证产品,支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等标准协议,提供安全、标准和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、RBAC权限管理和资源管理等。官方网站官网|官网二线1054466084代码托管Gitee|GitHub。

1363

MaxKey单点登录认证系统v3.5.1GA发布

MaxKey单点登录认证系统是业界领先的IAM身份管理和认证产品,支持OAuth2.x、OpenID Connect、SAML2.0、JWT、CAS、SCIM等SSO标准协议

454

MaxKey 单点登录认证系统前后端分离 v3.5.0GA 发布

English|中文 概述 MaxKey单点登录认证系统,谐音马克思的钥匙寓意是最大钥匙,是业界领先的 IAM 身份管理和认证产品, 支持 OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM 等标准协议,提供安全、标准和开放的用户身份管理 (IDM)、身份认证 (AM)、单点登录 (SSO)、RBAC 权限管理和资源管理等。 官方网站 官网 https://maxkey.top | 官网二线 https://maxkeytop.gitee.io ...

兰陵笑笑生 608

ActiveMQ简单介绍

我们简单的介绍一下消息中间件,对它有一个基本认识就好,消息中间件(MOM:Message Orient middleware)。 消息中间件有很多的用途和优点: 将数据从一个应用程序传送到另一个应用程序,或者从软件的一个模块传送到另外一个模块; 负责建立网络通信的通道,进行数据的可靠传送。 保证数据不重发,不丢失 能够实现跨平台操作,能够为不同操作系统上的软件集成技工数据传送服务 MQ 首先简单的介绍一下MQ,MQ英文名MessageQueue,中文名也就是大家用的消息队列,干嘛用的呢,说白了就是一个.

xmh_sxh_1314的博客 1465

单点登录资料收集(谷歌篇)

来源:www.google.cn,关键词“单点登录”,时间2007-05-11上午敬告读者:实际上,像这样使用单个关键词得到的搜索结果文档数量是巨大的,对于初涉该领域的新手有用,对于有一定基础的人员来说,几乎就是大米,早就吃过了。更好的基于搜索引擎的网络资料收集方法是 使用多个关键词,另外“在结果中搜索”也许能使您事半功倍。解决方案:网站用户单点登录系统解决方案

awuzi的专栏 913

Java就业班2021最新升级版 Java提升中级

2021年Java零基础入门到初中级水平,大型互联网公司主流技术框架 (如Dubbo、Zookeeper、ElasticSearch、MyCat、 微信支付、Jenkins、Vue、Spring Security CAS、百度地图、GIT等)、 Lambda表达式及其他新特性、Spring全家桶(Spring Boot /Spring Data/Spring Cloud等) 等现阶段企业流行技术和知识点; 由入门案例到详细工作原理及特性的解析,循序渐进,逐步深入。 1. 阶段一 Java基础+加强 2.阶

weixin_46408092的博客 556

基于Asp.net的购物网站系统

随着电子商务的快速发展,购物网站已经成为人们日常生活中不可或缺的一部分。为了满足市场需求,我们决定开发一个基于Asp.net的购物网站系统。该系统将提供丰富的商品信息、便捷的购物体验和高效的后端管理功能。

毕业设计大牛哥 2340

常见面经整理

一、Redis 1、Redis数据类型 String:字符串类型,最简单的类型 Hash:类似于Map的一种结构。 List:有序列表。 Set:无序集合。 ZSet:带权值的无序集合,即每个ZSet元素还另有一个数字代表权值,集合通过权值进行排序。 2、什么情况下使用redis 针对热点数据进行缓存 对于特定限时数据的存放 针对带热点权值数据的排序list 分布式锁 3、简述缓存穿透 缓存穿透指缓存和数据库均没有需要查询的数据,攻击者不断发送这种请求,使数据库压力过大。 4、简述缓存穿透的解决方法

weixin_46919654的博客 6037

ExtJS 4.0 的改变(仅发表我发现的)

[size=large]最近写了一个较为完整版(有部分细节没说)的,去看看这里吧http://andy-ghg.iteye.com/admin/blogs/1133456[/size] 很久没有写ExtJS了,之前在忙一个BI项目,没有用到ExtJS,于是几乎将其淡忘了,上个礼拜天偶然发现已经更新4.0正式版了,于是拿起来玩玩,结果发现了很多不适应,但是ExtJS基本上是在往一个好的方向在走...

HNsnopy的专栏 224
上一篇: [08]从零开始的JAVAEE-常见锁策略(八股文内容)
下一篇: [10]从零开始的JAVAEE-JUC库常用组件(八股文内容)
不卷啊
博客等级 码龄5年 316粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不卷啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值