【CAP】CAS和自旋锁

编程入门 行业动态 更新时间:2024-10-09 18:16:45

【<a href=https://www.elefans.com/category/jswz/34/1770644.html style=CAP】CAS和自旋锁"/>

【CAP】CAS和自旋锁

自旋锁可以看成是不断自动重试的乐观锁,也会有乐观锁的ABA问题。

自旋锁的实现基础是CAS功能。

什么是自旋锁?

自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。

获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成busy-waiting。

它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。

两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,”自旋”一词就是因此而得名。

什么是CAS

CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术。

这里以AtomicInteger说明一下

    public final int incrementAndGet() {for (;;) {int current = get();int next = current + 1;if (compareAndSet(current, next))return next;}}

加1就是先获取当前值,加1,设置时先对比当前值是不是内存中的值,如果是设置新值。

内存对比是通过本地方法实现的,需要操作系统的支持。

如果成功就可以退出循环,否则一直尝试。

用AtomicReference实现自旋锁

自旋锁就是线程调用lock()后,其他线程再调用lock()会卡住,等待锁的释放。

public class SpinLock {private AtomicReference<Thread> lock = new AtomicReference<Thread>();public void lock() {Thread current = Thread.currentThread();// 利用CASwhile (!lockpareAndSet(null, current)) {// DO nothing}}public void unlock() {Thread current = Thread.currentThread();lockpareAndSet(current, null);}
}

可以看出,第一个线程调用lock()时lock没有set过值,对象是null,第二个线程在调用时已经set过值,所以会一直循环。

只有当第一个线程unlock()之后第二个循环才能结束。

.htm

更多推荐

【CAP】CAS和自旋锁

本文发布于:2024-03-09 12:26:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1724962.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:CAP   CAS

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!