CAS

什么是CAS?

CAS 是英文单词Compare And Swap的缩写,翻译过来就是比较并交换的意思。
CAS中有三个基本的操作数:内存地址V、旧的预期值A、要修改的值B,如果要更新一个变量的时候,只有当内存地址V == 旧的预期值A,也就是当且仅当:变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B
这样说可能有些抽象,下面看一张图:
在这里插入图片描述

CAS的缺点:

  1. CPU开销大
    在并发量很高的情况下,如果有多个线程反复的尝试去更新某一个新的变量,却一直不能更新成功的时候,循环往复,会给CPU带来很大的压力。
  2. 不能保证代码块的原子性,只能保证一个变量的原子操作。
  3. ABA的问题
    这是CAS机制最大的问题所在

代码示例

//代码一:下面这段代码最后打印的结果有可能会小于200
public class CountTest{
	public static int count = 0;
	public static void main(String [] args){
		//开启两个线程
		for(int i = 0;i<2;i++){
			new Thread(
				new Runnable(){
					public void run(){
						try{
							Thread.sleep(10);
						}catch(InterruptedException e){
							e.printStackTrace();
						}
						//在每个线程中,让count的值自增100次
						for(int j= 0;j<100;j++){
							count ++;
						}
					}
				}
			).start();
		}
		try{
			Thread.sleep(2000);
		}catch(InterruptedException e){
			e.printStackTrace();
		}
		System.out.print("count= "+count);
	}
}

//代码二(加"synchronized"):下面这段代码最后打印的结果一定是200
public class CountTest{
	public static int count = 0;
	public static void main(String [] args){
		//开启两个线程
		for(int i = 0;i<2;i++){
			new Thread(
				new Runnable(){
					public void run(){
						try{
							Thread.sleep(10);
						}catch(InterruptedException e){
							e.printStackTrace();
						}
						//在每个线程中,让count的值自增100次
						for(int j= 0;j<100;j++){
							synchronized(CountTest.class){
								count ++;
							}
						}
					}
				}
			).start();
		}
		try{
			Thread.sleep(2000);
		}catch(InterruptedException e){
			e.printStackTrace();
		}
		System.out.print("count= "+count);
	}
}

//代码三(使用"CAS"操作):下面这段代码最后打印的结果一定是200
所谓原子操作类,指的是java.util.concurrent.atomic包下,一系列以Atomic开头的包装类。例如AtomicBoolean,AtomicInteger,AtomicLong。它们分别用于Boolean,Integer,Long类型的原子性操作。

public class CountTest{
	//public static int count = 0;
	public static AtomicInteger count = new AtomicInteger(0);
	public static void main(String [] args){
		//开启两个线程
		for(int i = 0;i<2;i++){
			new Thread(
				new Runnable(){
					public void run(){
						try{
							Thread.sleep(10);
						}catch(InterruptedException e){
							e.printStackTrace();
						}
						//在每个线程中,让count的值自增100次
						for(int j= 0;j<100;j++){
							count.increamentAndGet();
						}
					}
				}
			).start();
		}
		try{
			Thread.sleep(2000);
		}catch(InterruptedException e){
			e.printStackTrace();
		}
		System.out.print("count= "+count);
	}
}

这两种方式的性能比较:

Synchronized关键字会让没有得到锁的线程进入BLOCKED 状态,而后在争夺到锁资源后恢复为RUNNINGABLE 状态,这个过程中涉及到操作系统用户模式 和 内核模式间来回切换,这样的切换代价很高,尽管在jdk1.6以后 Synchronized 关键字做了优化,增加了从偏向锁到轻量级锁再到重量级锁的过渡,但是在最终转变为重量级锁之后,性能仍然很低。

CAS(Central Authentication Service)是一种为大型网络环境提供单点登录功能的开源软件。CAS Cookie是CAS系统中用于维持用户会话状态的一种身份验证机制。 CAS提供了一个统一的身份验证服务,允许用户在成功登录到一个应用程序后,在访问其他受信任的应用程序时不需要再次输入用户名和密码。这个被授权的会话状态是通过CAS Cookie来保持的。 CAS Cookie是一个存储在用户浏览器中的小型文件,由CAS服务器发送给用户在登录后,用于在用户在同一个网页应用程序中未注销的情况下保持其登录状态。CAS Cookie包含了用户的身份验证信息和有效期等相关信息。 当用户在访问其他需要身份验证的受信任应用程序时,CAS服务器会检查用户是否已经登录。如果用户已经登录并存在有效的CAS Cookie,CAS服务器将使用该Cookie中的用户信息来验证用户身份,并允许用户继续访问受保护的资源。如果用户未登录或CAS Cookie已失效,CAS服务器将要求用户重新输入用户名和密码进行身份验证。 使用CAS Cookie带来了便利性和安全性之间的平衡。它方便用户在不同应用程序之间的无缝切换,避免了频繁输入登录凭证的麻烦。同时,CAS Cookie的有效期限制了用户会话的持续时间,提高了系统安全性,减少了恶意攻击的风险。 总之,CAS Cookie是CAS系统中的一种身份验证机制,通过在浏览器中存储会话状态信息,实现了单点登录的功能。它既方便了用户的使用体验,同时又提高了系统的安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值