聊聊cas(代码片段)

Mr.袋鼠 Mr.袋鼠     2022-10-29     735

关键词:

哥有故事,你有酒,长夜漫漫,听我给你说。

 参考资源:

https://blog.csdn.net/hsuxu/article/details/9467651

 

1.概述

CAS,compare and swap ,“比较交换”的意思。它是一种并发状态下的,比较交换的策略。

想必,我们一定听说过乐观锁的概念,并发中乐观锁的核心概念就是应用了CAS。它包含了三个值:内存值,预期值和更新值。当内存值和预期值相等时,就会使用更新值将原来的数据(预期值)进行更新;如果不相等,则什么都不做。

 

2.例子

举个经典的例子,帮助大家理解。(伪代码)

 1  public class AtomicInt 
 2    private volatile int value;
 3    public final int get() 
 4        return value;
 5     
 6 
 7 publicfinal int getAndIncrement() 
// 下面的for的无限循环,就是经典的CAS自旋(Compare and swap)
8 for (;;) 9 int current = get(); 10 int next = current + 1; 11 if (compareAndSet(current, next)) 12 return current; 13 14 15 16 public final boolean compareAndSet(int expect, int update) 17 unsafe.compareAndSwapInt方法(方法内部,使用JNI调用C的代码); 18 19

 

3.凡事问个为什么.

为什么要比较?为什么要用CAS的自旋?直接设值不行吗?它有什么优点缺点?

例如,i++ 这个简单的操作不是一步完成的,而是分了三步。第一步,取值,第二步加一,第三部更新值。

假设有A,B两个线程同时操作i++这个处理,那么,当线程A完成上述第二步的时候,线程B已经将I的值更新(第三步)做完了。这样就会导致值发生异常,就是所谓的线程不安全。

所以,利用了乐观锁的思想采用了自旋的方式,每一次,就会先取得加一后的值,再将旧的值和内存中的值进行比较,如果相等,则说明,没有被别的线程动过,因此可以正常更新;如果不相等,则说明值已经被更新了,放弃本次的操作,从头再来,再重新取值,加一,更新。

 

CAS自旋(乐观锁)避免了悲观锁独占的现象,同时提高了并发的性能。但是,它也是有缺点的。(第三点参考了其他文章)

①乐观锁只能保证一个变量的的原子操作,多个变量的话,就没有办法了。

②长时间自旋,导致CPU消耗过大。

③ABA问题。CAS的核心思想是通过比对内存值与预期值是否一样而判断内存值是否被改过,但是,假如内存值原来是A,后来被一条线程改为B,最后又被改成了A,则CAS认为此内存值并没有发生改变,但实际上,被其他线程改过。这种情况对依赖过程值的情景的运算结果影响很大。解决的思路是引入版本号,每次变量更新都把版本号加一。

 

就聊这么多,祝君好梦!

 

java——聊聊juc中的cas原理(代码片段)

文章目录:1.引言2.引出CAS3.什么是CAS?4.AtomicReference简单应用5.CAS与自旋锁6.CAS两大缺点6.1 循环时间长开销很大6.2ABA问题1.引言说到CAS,大家肯定都会想到原子类,其实原子类的基础就是CAS,CAS的基础就是自旋... 查看详情

java——聊聊juc中的cas原理(代码片段)

文章目录:1.引言2.引出CAS3.什么是CAS?4.AtomicReference简单应用5.CAS与自旋锁6.CAS两大缺点6.1 循环时间长开销很大6.2ABA问题1.引言说到CAS,大家肯定都会想到原子类,其实原子类的基础就是CAS,CAS的基础就是自旋... 查看详情

聊聊公平锁和非公平锁(代码片段)

AQS中公平锁和非公平锁怎么实现的?如上图所示,公平锁和非公平锁的代码主要有两处地方有区别:公平锁调用lock()方法获取锁时,直接抢占锁【acquire(1),注释1】,非公平锁调用lock()方法获取锁时,先执行cas获取锁,获取失败... 查看详情

cas(代码片段)

CompareAndSwap比较并交换 硬件同步原语 .NET通过 System.Threading.Interlocked.CompareExchang重载实现CAS 自旋锁CAS实现publicclassSpinLockprivatevolatileintlocked;publicvoidAquire()while(System.Threading. 查看详情

cas入门(代码片段)

 安装环境jdk1.8、tomcat8、cas5.1之前使用的是cas5.1和tomcat7,怎么都跑不通,一直以为是配置的问题,一查资料才知道是cas5 以上至少要tomcat8以上版本。cas5源码下载官网cas主页地址: https://www.apereo.org/projects/casgithub源码主... 查看详情

cas原理解析cas底层(代码片段)

CAS底层原理概念CAS的全称是Compare-And-Swap,它是CPU并发原语它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的CAS并发原语体现在Java语言中就是sun.misc.Unsafe类的各个方法。调用UnSafe类中的C... 查看详情

cas原子操作(代码片段)

理会CAS和CAS:  有时候面试官面试问你的时候,会问,谈谈你对CAS的理解,这时应该有很多人,就会比较懵,当然,我也会比较懵,当然我和很多人的懵不同,很多人可能,并不知道CAS是一个什么东西,而在我看来我是不知道他问的是那个CAS... 查看详情

cas原理应用(代码片段)

原子CAS操作原子操作指令里,有原子加,原子减,cas到底是什么呢?首先看一段代码,boolcompare_and_swap(int*accum,int*dest,intnewval)if(*accum==*dest)*dest=newval;returntrue;else*accum=*dest;returnfalse;cas即是Compare-and-swap,先比较再互换,即修改 查看详情

cas(代码片段)

CAS一.简介利用锁保证线程安全会造成CPU资源浪费(例如线程调度,线程上下文切换等),考虑到锁带来的开销,引入了无锁算法CAS(CompareAndSwpa,比较交换),成为整个JUC体系最核心、最基础理论。CAS一定要volatile变量配合,这样... 查看详情

cas讲解(代码片段)

CAS,CompareandSwap即比较并交换,设计并发算法时常用到的一种技术,java.util.concurrent包全完建立在CAS之上,没有CAS也就没有此包,可见CAS的重要性。当前的处理器基本都支持CAS,只不过不同的厂家的实现不... 查看详情

juc-cas详解(代码片段)

CAS解析CAS(CompareAndSwap):比较并替换讲到CAS肯定要说到AtomicInteger等一系列原子类比如AtomicInteger自增操作时如何保证原子操作的其中就是利用了CAS自旋锁,CAS通过Unsafe来通过JVM本地方法操作内存指针完成其中一个重要方法 p... 查看详情

juc-cas详解(代码片段)

CAS解析CAS(CompareAndSwap):比较并替换讲到CAS肯定要说到AtomicInteger等一系列原子类比如AtomicInteger自增操作时如何保证原子操作的其中就是利用了CAS自旋锁,CAS通过Unsafe来通过JVM本地方法操作内存指针完成其中一个重要方法 p... 查看详情

cas相关问题(代码片段)

上个礼拜搞安全问题,搞了几天,大部分是关于登录、账密、权限问题,现在做一个简单的总结 一,CAS我这里是要在CAS里面做一个‘密码错误5次就锁定30分钟’。因为时刚拿到CAS,不太熟悉。问了一下同事,同事说好... 查看详情

noprincipalwasfoundintheresponsefromthecasserver(代码片段)

按网上的配置了publicStringcasServerUrlPrefix="http://cas-server.com:8080/cas";publicStringcasServerLoginUrl="http://cas-server.com:8080/cas/login";其它的都没问题,结果一直报错,NoprincipalwasfoundintheresponsefromtheCASserverNoprincipalwasfoundintheresponsefromtheCASserver搞了半... 查看详情

cas(compareandswap)算法(代码片段)

CAS也叫自旋锁,用来保证操作的一致性,比如用2个线程同时对一个变量累加1000,000次,得到的结果可能比2000,000少:packagejuc.test.cas;importorg.junit.Test;importjava.util.concurrent.CountDownLatch;publicclassNonAtomicTeststaticlongvar=0;finalinttota 查看详情

聊聊hystrix的源码(代码片段)

聊聊Hystrix的源码今天我们说一下Hystrix的源码的内容@EnableCircuitBreaker注解需要使用Hystrix的时候,需要我们通过@EnableCircuitBreaker来开启断路器,那么我们看一下这个注解:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inheri... 查看详情

聊聊mybatis的事务模块(代码片段)

@[TOC]聊聊Mybatis的事务模块mybatis定义了自己的事务接口来实现事务,这里同样也使用了工厂模式工厂模式中的产品Transaction接口:publicinterfaceTransactionConnectiongetConnection()throwsSQLException;voidcommit()throwsSQLException;voidrollback()throwsSQ 查看详情

cas系列-cas登出(代码片段)

跟登陆一样,登出操作也很重要.由于是多应用间操作,状态保持也是一个要点,根据登出的影响范围,可以将登出操作分为两类:单应用登出单点登出(多应用登出)顾名思义,单应用登出即登出只影响被操作的应用会话,其他应用和CAS会... 查看详情