7.19 线程:CAS

简介

锁的分类
  • 悲观锁:synchronized是独占锁即悲观锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。
  • 乐观锁:每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,知道成功为止。
Compare and Swap(比较并交换)
  1. 乐观锁的实现:有三个值,一个当前内存值V、旧的预期值A、将更新的值B。先获取到内存当中当前的内存值V,再将内存值V和原值A作比较,要是相等就修改为要修改的值B并返回true,否则什么都不做, 并返回false.
  2. CAS是一组原子操作,不会被外部打断。
  3. CAS属于硬件级别的操作(利用CPU的CAS指令,同时借助JNI来完成的非阻塞算法),效率比加锁操作高。
  4. ABA问题:如果变量V初次读取的时候是A,并且在准备赋值的时候检查到它仍然是A,那能说明它的值没有被其它线程修改过了吗?如果在这段时间内曾经被改为B,然后又改回A,那CAS操作就会误认为它从来没有被修改过。

代码测试

code:

import java.util.concurrent.atomic.AtomicInteger;

/**
 * CAS:比较并交换
 * @author dxt
 *
 */
public class CAS {
	//库存
	private static AtomicInteger stock = new AtomicInteger(5);
	
	public static void main(String[] args){
		for(int i=0; i<5; i++){
			new Thread(new Runnable(){
				public void run(){
					try {
						Thread.sleep(100);	//模拟一下延时
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					Integer left = stock.decrementAndGet();
					if(left < 1){
						System.out.println("抢完了");
						return;
					}
					System.out.println(Thread.currentThread().getName() + "抢了一件商品" + "----还剩下" + left);
				}
			}).start();
		}
	}
}

result:
res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值