Java鎖之壅塞鎖引見和代碼實例。本站提示廣大學習愛好者:(Java鎖之壅塞鎖引見和代碼實例)文章只能為提供參考,不一定能成為您想要的結果。以下是Java鎖之壅塞鎖引見和代碼實例正文
鎖作為並發同享數據,包管分歧性的對象,在JAVA平台有多種完成(如 synchronized 和 ReentrantLock等等 ) 。這些曾經寫好供給的鎖為我們開辟供給了方便,然則鎖的詳細性質和類型卻很少被說起。本系列文章將剖析JAVA下罕見的鎖稱號和特征,為年夜家答疑解惑。
壅塞鎖
壅塞鎖,與自旋鎖分歧,轉變了線程的運轉狀況。
在JAVA情況中,線程Thread有以下幾個狀況:
1,新建狀況
2,停當狀況
3,運轉狀況
4,壅塞狀況
5,逝世亡狀況
壅塞鎖,可以說是讓線程進入壅塞狀況停止期待,當取得響應的旌旗燈號(叫醒,時光) 時,才可以進入線程的預備停當狀況,預備停當狀況的一切線程,經由過程競爭,進入運轉狀況。
JAVA中,可以或許進入\加入、壅塞狀況或包括壅塞鎖的辦法有 ,synchronized 症結字(個中的分量鎖),ReentrantLock,Object.wait()\notify(),LockSupport.park()/unpart()(j.u.c常常應用)
上面是一個JAVA 壅塞鎖實例:
package lock; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import java.util.concurrent.locks.LockSupport; public class CLHLock1 { public static class CLHNode { private volatile Thread isLocked; } @SuppressWarnings("unused") private volatile CLHNode tail; private static final ThreadLocal<CLHNode> LOCAL = new ThreadLocal<CLHNode>(); private static final AtomicReferenceFieldUpdater<CLHLock1, CLHNode> UPDATER = AtomicReferenceFieldUpdater.newUpdater(CLHLock1.class, CLHNode.class, "tail"); public void lock() { CLHNode node = new CLHNode(); LOCAL.set(node); CLHNode preNode = UPDATER.getAndSet(this, node); if (preNode != null) { preNode.isLocked = Thread.currentThread(); LockSupport.park(this); preNode = null; LOCAL.set(node); } } public void unlock() { CLHNode node = LOCAL.get(); if (!UPDATER.compareAndSet(this, node, null)) { System.out.println("unlock\t" + node.isLocked.getName()); LockSupport.unpark(node.isLocked); } node = null; } }
在這裡我們應用了LockSupport.unpark()的壅塞鎖。 該例子是將CLH鎖修正而成。
壅塞鎖的優勢在於,壅塞的線程不會占用cpu時光,不會招致 CPu占用率太高,但進入時光和恢復時光都要比自旋鎖略慢。
在競爭劇烈的情形下 壅塞鎖的機能要顯著高於 自旋鎖。
幻想的情形則是; 在線程競爭不劇烈的情形下,應用自旋鎖,競爭劇烈的情形下應用,壅塞鎖。
(全文完)