自旋锁是一种基于循环重试的锁,当线程尝试获取锁时,如果锁已经被其他线程持有,该线程不会立即阻塞,而是循环等待一段时间,直到获取到锁为止。
简单的自旋锁的实现示例:
import java.util.concurrent.atomic.AtomicReference;
public class SpinLock {
//这一行声明了一个 AtomicReference 类型的私有属性 owner,用来存储当前持有锁的线程。初始时,没有线程持有锁,因此初始化为 null
private AtomicReference<Thread> owner = new AtomicReference<>();
public void lock() {
//获取当前线程的引用
Thread currentThread = Thread.currentThread();
// 不断尝试将当前线程设置为锁的持有者,直到成功获取锁
while (!owner.compareAndSet(null, currentThread)) {
// 循环等待锁释放
//compareAndSet(null, currentThread) 的含义是:如果当前锁的持有者为 null,则将其设置为当前线程,以此来尝试获取锁。
}
}
public void unlock() {
Thread currentThread = Thread.currentThread();
// 尝试释放锁,将持有者置为 null
owner.compareAndSet(currentThread, null);
}
}
使用了 AtomicReference 来维护锁的状态。
lock() 方法不断尝试将当前线程设置为锁的持有者,如果设置成功则表示获取到了锁,否则会一直自旋等待。unlock() 方法释放锁,将持有者置为 null。