Java鎖之阻塞鎖介紹和代碼實例
鎖作為并發(fā)共享數(shù)據(jù),保證一致性的工具,在JAVA平臺有多種實現(xiàn)(如 synchronized 和 ReentrantLock等等 ) 。這些已經(jīng)寫好提供的鎖為我們開發(fā)提供了便利,但是鎖的具體性質(zhì)以及類型卻很少被提及。本系列文章將分析JAVA下常見的鎖名稱以及特性,為大家答疑解惑。
阻塞鎖
阻塞鎖,與自旋鎖不同,改變了線程的運(yùn)行狀態(tài)。
在JAVA環(huán)境中,線程Thread有如下幾個狀態(tài):
1,新建狀態(tài)
2,就緒狀態(tài)
3,運(yùn)行狀態(tài)
4,阻塞狀態(tài)
5,死亡狀態(tài)
阻塞鎖,可以說是讓線程進(jìn)入阻塞狀態(tài)進(jìn)行等待,當(dāng)獲得相應(yīng)的信號(喚醒,時間) 時,才可以進(jìn)入線程的準(zhǔn)備就緒狀態(tài),準(zhǔn)備就緒狀態(tài)的所有線程,通過競爭,進(jìn)入運(yùn)行狀態(tài)。
JAVA中,能夠進(jìn)入\退出、阻塞狀態(tài)或包含阻塞鎖的方法有 ,synchronized 關(guān)鍵字(其中的重量鎖),ReentrantLock,Object.wait()\notify(),LockSupport.park()/unpart()(j.u.c經(jīng)常使用)
下面是一個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鎖修改而成。
阻塞鎖的優(yōu)勢在于,阻塞的線程不會占用cpu時間,不會導(dǎo)致 CPu占用率過高,但進(jìn)入時間以及恢復(fù)時間都要比自旋鎖略慢。
在競爭激烈的情況下 阻塞鎖的性能要明顯高于 自旋鎖。
理想的情況則是; 在線程競爭不激烈的情況下,使用自旋鎖,競爭激烈的情況下使用,阻塞鎖。
(全文完)
相關(guān)文章
Java面試官最喜歡問的關(guān)鍵字之volatile詳解
這篇文章主要給大家介紹了關(guān)于Java面試官最喜歡問的關(guān)鍵字之volatile的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03idea中使用maven?archetype新建項目時卡住問題解決方案
這篇文章主要介紹了idea中使用maven?archetype新建項目時卡住,解決本問題的方法,就是在maven的runner加上參數(shù)-DarchetypeCatalog=local就可以了,不需要下載xml文件再放到指定目錄,需要的朋友可以參考下2023-08-08Java實現(xiàn)國產(chǎn)加密算法SM4的示例詳解
這篇文章主要為大家詳細(xì)介紹了Java如何實現(xiàn)國產(chǎn)加密算法SM4(ECB和CBC兩種模式),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-01-01