请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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回答

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

0 回复 有任何疑惑可以回复我~
  • 提问者 zero菌 #1
    不是,我测试了用这个自旋锁去锁并发修改的变量,输出的结果也是不正确的
    回复 有任何疑惑可以回复我~ 2020-04-04 20:31:01
  • 悟空 回复 提问者 zero菌 #2
    可以把你修改变量的完整代码贴一下吗
    回复 有任何疑惑可以回复我~ 2020-04-04 23:52:02
  • 提问者 zero菌 回复 悟空 #3
    找到问题了,是测试代码中的线程池还没关闭就打印了,所以结果不对
    回复 有任何疑惑可以回复我~ 2020-04-06 12:07:41
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信