自旋锁代码好像存在同时获取到锁的问题

来源:6-5 在自旋锁的应用

端碗吹水

2020-04-04

public class SpinLock {

    private AtomicReference<Thread> sign = new AtomicReference<>();

    public void lock() {
        Thread current = Thread.currentThread();
        // 自旋
        while (!sign.compareAndSet(null, current)) {

        }
    }

    public void unlock() {
        Thread current = Thread.currentThread();
        sign.compareAndSet(current, null);
    }

    public static void main(String[] args) {
        SpinLock spinLock = new SpinLock();
        Runnable r = () -> {
            System.out.println(Thread.currentThread().getName() + "开始尝试获取自旋锁");
            spinLock.lock();
            try {
                System.out.println(Thread.currentThread().getName() + "获取到了自旋锁");
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                spinLock.unlock();
                System.out.println(Thread.currentThread().getName() + "释放了自旋锁");
            }
        };

        new Thread(r).start();
        new Thread(r).start();
    }
}

会有同时获取到锁的情况,JDK版本是11:
图片描述

写回答

1回答

index2

2020-04-04

会不会是在线程0执行spinLock.unlock()释放锁后,还没有打印出“释放了自旋锁”,线程2就先拿到了锁并且打印出了“获取到自旋锁”,实际上此时线程0已经释放了锁。

0
3
端碗吹水
回复
悟空
找到问题了,是测试代码中的线程池还没关闭就打印了,所以结果不对
2020-04-06
共3条回复

深度解密Java并发工具,精通JUC,成为并发多面手

JUC全方位讲解,构建并发工具类知识体系

1599 学习 · 573 问题

查看课程