CAS和AQS详解

一、CAS

CAS:就是把内存中的一个属性,从oldValue,替换为newValue。保证原子性。

核心逻辑方法:compareAndSwapInt(this,offset,expected,x)

this:当前对象

offset:偏移量

expected:期望值

x: 修改值

工作原理:主内存中的value值,用expected值与主内存中的value值比较,相等就修改。不相等获取内存中value值,继续循环修改直至成功。无锁操作,修改失败就失败了。

JUC(java.util.concurrent)的atomic包中AtomicInteger、AtomicLong、AtomicBoolean底层应用CAS实现。解决ABA问题,AtomicStampedReference通过reference标记来实现(类似版本号)。

二、AQS

AQS:线程同步框架,JUC包下的基类AbstractQueuedSynchronizer,没有具体的方法实现。JUC包下的类或多或少都继承了AQS。

比如:ReentrantLock、RennTrantReadWriteLock、CountDownLatch、CyclicBarrier、Semaphore等。

AQS主要有下面3个参数组成

state:0空闲,1被占用

head(单项链表):共享或互斥、waitStatus、thread、prev、next

tail(单项链表):共享或互斥、waitStatus、thread、prev、next

执行逻辑:

        1、如果现在有A、B两个线程来抢锁,谁能把state置位1谁就会获取这把锁。

        2、如果A获得了这把锁,B就会构建Node放入阻塞队列。

        3、刚开始head和tail链表都指向null,B线程会构建Node(互斥、waitStatus=0,thread=B,prev指向head,next指向tail),tail指向Node(B)。head的waitStatus=1,证明后面有人挂起。

        4、此时如果C线程来了,首先它会去尝试一下抢锁,尝试几次失败加入阻塞队列,过程和B相似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值