原 setState 和 compareAndSetState方法作用分析

本文深入分析AQS中getState, compareAndSetState及setState方法的区别与应用场景。compareAndSetState用于尝试加锁时修改state,保证原子性;setState用于持锁线程修改state,注重性能。

AQS中有三个protected方法:getState, setState, compareAndSetState。

这三个方法是AQS中提供给自定义同步器来获取state状态的三个基本工具方法,那么setState和compareAndSetState都是用来修改状态的,两者有什么不一样,为什么两者能共存,其各自使用场景分别是什么?

分析AQS和ReentrantLock的源码可知:

compareAndSetState通常用于在获取到锁之前,尝试加锁时,对state进行修改,这种场景下,由于当前线程不是锁持有者,所以对state的修改是线程不安全的,也就是说可能存在多个线程都尝试修改state,所以需要保证对state修改的原子性操作,即使用了unsafe类的本地CAS方法;
setState方法通常用于当前正持有锁的线程对state变量进行修改,不存在竞争,是线程安全的,所以此处没必要用CAS保证原子性,修改的性能更重要。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值