compareAndSet 的理解

CAS是无锁的一种实现,通过compareAndSet方法不断尝试修改值,避免了synchronized的重量级锁带来的性能开销。自旋锁在高CPU性能环境下有效,但面临竞争激烈时可能导致忙等,消耗CPU资源。相对于等待通知的同步机制,自旋锁减少了锁的使用,提高了某些场景下的效率。
1.用法

用法 xxx.compareAndSet (x,y)

x:预判值 。 y :修改值。

讲 x 的值修改为 y。

方法返回值是 Boolean 类型。

2. 思考
  1. 该方法是属于 cas 自旋锁的重要工具。 自旋锁就是无锁。因为没有加锁。锁是一种很重量级的东西,例如 sy… 加上之后程序运行速度奇慢无比。而此时出现了代替他的自旋锁。

  2. 为什么要用 cas 取代 sy…

使用 cas 一般需要 while 循环配合试错。当尝试的结果返回 true 的时候执行一些列的操作。就好比你去上厕所要不停地去检查有没有一间厕所门是开着的。

而 sy… 相反一般配合 notify 使用,你第一次没抢到厕所,会有人上完之后温馨提醒你去有空的厕所。

我们都知道 加锁 sy。。是一种很重量级的操作。时间消耗很高,而不断试错 (自旋锁) 的成本很低。两个成本相比较而言,试错优胜,所有自旋锁胜出。 他们的目标是相同的。都是上厕所。我自旋锁虽然要去看一万遍有没有空的房间,但是成本依然很低,因为现在的 cpu 性能都很高。而加锁很拖慢时间。因为锁里面的操作涉及指令重排序等等。

  1. 自旋锁的问题。既然我把自旋锁猛夸一边,难道他就没什么问题吗 。当然有。就像有,三个人同时看见一间厕所怎么办?

  2. 让最先看见的人去上 ,不停看厕所有没有人,但是这样也是很消耗 cpu 的。类似于忙等。

  3. 让最先看见的人去上厕所,其余人回去睡觉 (wait)。这样也会涉及加锁问题但是锁里面的代码块很少。相比之前。运行更加快了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值