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隊列鎖。算法