Gloomy_H 2017-10-31 04:44
浏览 451

CLH锁发现的问题,望有大佬解决

在学习自旋锁发现的了一个问题,看了两个版本,第一版本A :http://blog.csdn.net/fei33423/article/details/30316377;主要是在这个版本下发现的,然后又找了另一个版本B: http://blog.csdn.net/bingjing12345/article/details/17789613.这两个版本主要区别在与解锁时是否调用原子对象的compareAndSet,第二个版本在多线程执行下能出现我想要的结果,但是其中的AtomicReference并没有用处,所以我认为是要在unlock方法中进行一次比较,只有相等才能去解除自旋,也就延伸成了第一个版本。但是第一个版本在多线程下会出现一个问题,例如启动10个线程后,在解锁的时候只有部分线程解除自旋,而还有一部分线程因等待条件在while中无限x循环,导致CPU一直被占据。在我认为是在线程加锁过程中,UPDATER被一个线程的CLHNode换了,其余线程因为取不到自身的CLHNode而导致不能解锁,故一直在循环。希望有大佬能指示下。下面贴一下自己的测试代码:
package cn.gloomy.h.lock;
public class CLHLockTest {
private CLHLock lock = new CLHLock();
// final ClhSpinLock lock = new ClhSpinLock();
public static void main(String []args) {
new CLHLockTest().test();
}

public void test() {
    int i=1;
    while(i<15) {
        new MyThread("M"+i).start();
        i++;
    }
}

private class MyThread extends Thread{
    private String name;
    public MyThread(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        lock.lock();
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(this.name+"-Thread :"+Thread.currentThread().getId());
        lock.unlock();
    }
}

}

注:我在CLHLock的unlock方法末尾加了句输出语,但到运行结束只有一条输出。

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 如何让企业微信机器人实现消息汇总整合
    • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
    • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
    • ¥15 TLE9879QXA40 电机驱动
    • ¥20 对于工程问题的非线性数学模型进行线性化
    • ¥15 Mirare PLUS 进行密钥认证?(详解)
    • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
    • ¥20 想用ollama做一个自己的AI数据库
    • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
    • ¥15 请问怎么才能复现这样的图呀