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 有赏,i卡绘世画不出
    • ¥15 如何用stata画出文献中常见的安慰剂检验图
    • ¥15 c语言链表结构体数据插入
    • ¥40 使用MATLAB解答线性代数问题
    • ¥15 COCOS的问题COCOS的问题
    • ¥15 FPGA-SRIO初始化失败
    • ¥15 MapReduce实现倒排索引失败
    • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
    • ¥15 找一位技术过硬的游戏pj程序员
    • ¥15 matlab生成电测深三层曲线模型代码