对话面试官---自己实现自旋锁怎么实现?用Java代码

发布时间:2023年12月27日

自旋锁是一种基于循环重试的锁,当线程尝试获取锁时,如果锁已经被其他线程持有,该线程不会立即阻塞,而是循环等待一段时间,直到获取到锁为止。
简单的自旋锁的实现示例:

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。

文章来源:https://blog.csdn.net/qq_51711443/article/details/135253155
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。