sinat_34442346
Gloomy_H
2017-10-31 04:44

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

  • 线程
  • 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条回答

为你推荐