国产探花免费观看_亚洲丰满少妇自慰呻吟_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占用率過高,但進入時間以及恢復時間都要比自旋鎖略慢。

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

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

(全文完)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镇康县| 贵港市| 宁阳县| 河曲县| 乐山市| 兴隆县| 英超| 河北省| 灵川县| 石台县| 濮阳市| 江都市| 隆回县| 慈利县| 南昌县| 沙坪坝区| 河曲县| 大田县| 盱眙县| 六枝特区| 三明市| 淳安县| 天等县| 喜德县| 阳泉市| 厦门市| 巴塘县| 重庆市| 盐池县| 扎兰屯市| 蒲江县| 鄱阳县| 南木林县| 紫阳县| 平湖市| 沙洋县| 车险| 大新县| 龙里县| 分宜县| 甘谷县|