CLH算法实现html
1 public class CLHLock { 2
3 AtomicReference<QNode> tail = new AtomicReference<QNode>(new QNode()); 4 ThreadLocal<QNode> myPred; 5 ThreadLocal<QNode> myNode; 6
7 public static class QNode { 8 //注意这个地方 若是不加volatile则会致使线程永远死循环 9 //关于volatile的用法在个人另一篇文章 http://www.cnblogs.com/daxin/p/3364014.html
10 public volatile boolean locked = false; 11 } 12
13 public CLHLock() { 14 myNode = new ThreadLocal<QNode>() { 15 protected QNode initialValue() { 16 return new QNode(); 17 } 18 }; 19 myPred = new ThreadLocal<QNode>() { 20 protected QNode initialValue() { 21 return null; 22 } 23 }; 24 } 25
26 public void lock() { 27 QNode qnode = myNode.get(); 28 qnode.locked = true; 29 QNode pred = tail.getAndSet(qnode); 30 myPred.set(pred); 31 while (pred.locked) { 32 //非阻塞算法
33 } 34 } 35
36 public void unlock() { 37 QNode qnode = myNode.get(); 38 qnode.locked = false; 39 myNode.set(myPred.get()); 40 } 41 }
CLH优缺点node
CLH队列锁的优势是空间复杂度低(若是有n个线程,L个锁,每一个线程每次只获取一个锁,那么须要的存储空间是O(L+n),n个线程有n个myNode,L个锁有L个tail),CLH的一种变体被应用在了JAVA并发框架中。惟一的缺点是在NUMA系统结构下性能不好,在这种系统结构下,每一个线程有本身的内存,若是前趋结点的内存位置比较远,自旋判断前趋结点的locked域,性能将大打折扣,可是在SMP系统结构下该法仍是很是有效的。一种解决NUMA系统结构的思路是MCS队列锁。算法