一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java鎖之阻塞鎖介紹和代碼實例

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

2019-11-29 16:02junjie 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 阻塞鎖實例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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占用率過高,但進入時間以及恢復時間都要比自旋鎖略慢。

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

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

(全文完)

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本高清在线观看天码888 | 国产成人盗摄精品 | 日本xxxx18vr69 | 91茄子| 色综合久久中文字幕网 | 韩国漂亮美女三级在线观看 | 久久综合香蕉久久久久久久 | 8x在线永久成人影院 | 91精品国产一区 | 国产亚洲成归v人片在线观看 | 欧美草逼网 | 日产欧产va高清 | freehd182d动漫| 男人天堂视频网 | 非洲一级毛片又粗又长aaaa | 按摩师他揉我奶好爽捏我奶 | 91啦在线视频 | 欧美综合一区二区三区 | 无码一区国产欧美在线资源 | 久久青草免费91线频观看站街 | 视频网站入口在线看 | 国产亚洲sss在线播放 | 狠狠色| 亚洲免费网站在线观看 | 亚洲琪琪 | 日韩 欧美 国产 亚洲 中文 | 国产区最新 | 毛片视频在线免费观看 | 我和么公的秘密小说免费 | 人人看人人射 | caonila国产在线观看 | 精灵之森高清在线 | 日本在线观看www免费 | 成人久久伊人精品伊人 | 免费一级特黄特色大片∵黄 | 四虎最新永久免费视频 | 天天夜夜啦啦啦 | 激情男人天堂 | 免费精品一区二区三区在线观看 | 第一次不是你高清在线观看 | 奇米影视先锋 |