在学习自旋锁发现的了一个问题,看了两个版本,第一版本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方法末尾加了句输出语,但到运行结束只有一条输出。