国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java鎖之阻塞鎖介紹和代碼實例

2019-11-26 15:25:00
字體:
來源:轉載
供稿:網友

鎖作為并發共享數據,保證一致性的工具,在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占用率過高,但進入時間以及恢復時間都要比自旋鎖略慢。

在競爭激烈的情況下 阻塞鎖的性能要明顯高于 自旋鎖。

理想的情況則是; 在線程競爭不激烈的情況下,使用自旋鎖,競爭激烈的情況下使用,阻塞鎖。

(全文完)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 工布江达县| 丰都县| 达日县| 阿勒泰市| 古浪县| 台安县| 河北区| 鄱阳县| 叶城县| 漯河市| 兴城市| 濮阳县| 博兴县| 宁阳县| 岚皋县| 两当县| 广州市| 岳阳县| 英超| 广元市| 五莲县| 江口县| 淮阳县| 凤冈县| 甘德县| 遵化市| 丰县| 高邑县| 苏尼特右旗| 类乌齐县| 仲巴县| 多伦县| 清涧县| 苗栗县| 赤壁市| 涿州市| 株洲县| 明星| 日喀则市| 岳普湖县| 通辽市|