CAS核心思想、底层实现


★ 1、CAS 是什么

CAS 是比较并交换,是实现并发算法时常用到的一种技术当内存的值和期望的值相等时,进行更新,否则 什么都不做重来

CAS 的底层实现:是靠硬件实现的,靠硬件的原子性实现CAS是一条CPU的原子指令cmpxchg指令),不会造成所谓的数据不一致问题

重来==>自旋

CAS 类似乐观锁,乐观的认为别人没有修改,当值还是预期值,就进行修改,否则可能什么都不做,或者重来。


★ 2、CAS 应用举例

  • 原子操作类,比如整型的原子操作类的compareAndSet方法
  • 我的博客项目中,在更新文章浏览次数时,当前内存的文章浏览次数 和 期望中的数据库的文章浏览次数 进行比较,如果是相同的,则加1,否则 什么都不做



3、原子类

原子类==> 底层思想/工作原理 CAS ==> Unsafe 类的CPU 原语级别的汇编操作

  • CAS 是靠硬件实现的,靠硬件的原子性实现CAS是一条CPU的原子指令cmpxchg指令),不会造成所谓的数据不一致问题

    Unsafe提供的CAS方法(如compareAndSwapXXX)底层实现即为CPU指令cmpxchg。


■ AtomicInteger 类主要利用 CAS + volatile 和 native 方法来保证原子操作,从而避免 synchronized 的高开销,执行效率大为提升。

new AtomicInteger().compareAndSet(0, 1);

// 底层实现
public final int getAndAdd(int delta) {
 return unsafe.getAndAddInt(this, valueOffset, delta);
}
public final boolean compareAndSet(int expect, int update) {
 return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}



new AtomicInteger().getAndAdd(1);//获取到当前值并加1
// 底层实现
public final int getAndAdd(int delta) {
return unsafe.getAndAddInt(this, valueOffset, delta);
}
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
   var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}

工作中,不建议使用Unsafe 类,类名就提示你了"不安全"!



4、Unsafe 类

  • 是CAS的核心类
  • 可以像C的指针一样直接操作内存
  • Unsafe类中的所有方法都是native修饰的Unsafe类中的方法都可以直接调用操作系统底层资源去执行相应任务
//原子类
public final int getAndIncrement() {
     return unsafe.getAndAddInt(this, valueOffset, 1);
}

private volatile int value;

变量valueOffset,表示该变量值在内存中的偏移地址,因为 Unsafe就是根据内存偏移地址获取数据的。

变量value用volatile修饰,保证了多线程之间的内存可见性。每次获取的值都是最新的。



5、CAS 带来的问题

  • 循环时间长,可能死循环,开销很大
  • ABA 问题
    • 解决ABA 问题: 带版本号的原子引用 AtomicStampedReference




如果本文对你有帮助的话记得给一乐点个赞哦,感谢!

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论
CAS(Central Authentication Service)单点登出的实现原理如下: 1. 用户在某个客户端应用程序点击登出按钮或者在其中一个应用程序进行登出操作。 2. 客户端应用程序将登出请求发送给CAS服务器。 3. CAS服务器接收到登出请求后,会将该请求广播给所有已经登录的客户端应用程序。 4. 已经登录的客户端应用程序接收到登出请求后,会销毁用户的会话信息,使用户在该应用程序中无法再访问受保护资源。 5. CAS服务器将登出请求的状态返回给发起登出请求的客户端应用程序。 6. 客户端应用程序根据返回的状态进行相应的操作,如重定向到登出成功页面或者显示登出成功的提示信息。 CAS单点登出通过在CAS服务器上集中管理用户的会话信息,实现了用户在一个应用程序中登出后,其他已经登录的应用程序也会被注销。这样可以确保用户在任何一个已登录的应用程序中进行登出操作后,都能够得到一致的登出状态。同时,CAS服务器还可以提供注销其他已登录应用程序的功能,以便用户在特定情况下快速注销所有已登录的应用程序。 需要注意的是,CAS单点登出的实现需要客户端应用程序和CAS服务器之间进行通信,以便将登出请求传递给所有已登录的应用程序。因此,客户端应用程序需要正确配置CAS服务器的地址和认证密钥,以确保通信的安全性和有效性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

伟庭大师兄

你的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值