CAS(CompareAndSet)顾名思义,比较进行更新,总的来说就是再更新值得时候需要判断一些原先值是否是预期值,是则更新,不是则更新失败
public class SpinLock {
private static AtomicReference<Thread> atomicThread = new AtomicReference<>(); // 初始值为null
public void lock() {
Thread thread = Thread.currentThread();
// 自选获取锁 当初始值与期望值相同时, 则更新
while (!atomicThread.compareAndSet(null, thread)) {
System.out.println(thread.getName() + "尝试获取锁");
}
System.out.println(thread.getName() + "获取到锁");
}
public void unLock() {
Thread thread = Thread.currentThread();
System.out.println(thread.getName() + "释放锁");
atomicThread.compareAndSet(thread, null);
}
private static volatile int count = 0;
public static void main(String[] args) {
SpinLock spinLock = new SpinLock();
new Thread(() -> {
spinLock.lock();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
spinLock.unLock();
}
}).start();
new Thread(() -> {
spinLock.lock();
try {
// do something
} finally {
spinLock.unLock();
}
}).start();
}
}

本文通过一个简单的 SpinLock 示例,详细解释了 CAS(CompareAndSet)操作在并发控制中的作用。CAS 是一种无锁算法,用于在更新变量时检查其当前值是否与预期值相等,相等则更新,不等则失败。在 SpinLock 的实现中,使用 AtomicReference 并结合 CAS 实现线程安全的锁机制,确保了线程在获取和释放锁时的正确性。
156

被折叠的 条评论
为什么被折叠?



