欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java鎖之阻塞鎖介紹和代碼實(shí)例

 更新時(shí)間:2014年09月22日 08:47:03   投稿:junjie  
這篇文章主要介紹了Java鎖之阻塞鎖介紹和代碼實(shí)例,阻塞鎖與自旋鎖不同,它改變了線程的運(yùn)行狀態(tài),需要的朋友可以參考下

鎖作為并發(fā)共享數(shù)據(jù),保證一致性的工具,在JAVA平臺(tái)有多種實(shí)現(xiàn)(如 synchronized 和 ReentrantLock等等 ) 。這些已經(jīng)寫好提供的鎖為我們開發(fā)提供了便利,但是鎖的具體性質(zhì)以及類型卻很少被提及。本系列文章將分析JAVA下常見的鎖名稱以及特性,為大家答疑解惑。

阻塞鎖

阻塞鎖,與自旋鎖不同,改變了線程的運(yùn)行狀態(tài)。
在JAVA環(huán)境中,線程Thread有如下幾個(gè)狀態(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)的信號(hào)(喚醒,時(shí)間) 時(shí),才可以進(jìn)入線程的準(zhǔn)備就緒狀態(tài),準(zhǔn)備就緒狀態(tài)的所有線程,通過競(jìng)爭(zhēng),進(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)常使用)

下面是一個(gè)JAVA 阻塞鎖實(shí)例:

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)勢(shì)在于,阻塞的線程不會(huì)占用cpu時(shí)間,不會(huì)導(dǎo)致 CPu占用率過高,但進(jìn)入時(shí)間以及恢復(fù)時(shí)間都要比自旋鎖略慢。

在競(jìng)爭(zhēng)激烈的情況下 阻塞鎖的性能要明顯高于 自旋鎖。

理想的情況則是; 在線程競(jìng)爭(zhēng)不激烈的情況下,使用自旋鎖,競(jìng)爭(zhēng)激烈的情況下使用,阻塞鎖。

(全文完)

相關(guān)文章

  • Java如何通過線程解決生產(chǎn)者/消費(fèi)者問題

    Java如何通過線程解決生產(chǎn)者/消費(fèi)者問題

    這篇文章主要介紹了Java如何通過線程解決生產(chǎn)者/消費(fèi)者問題,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-10-10
  • 詳解Spring中的AOP及AspectJ五大通知注解

    詳解Spring中的AOP及AspectJ五大通知注解

    這篇文章主要介紹了詳解Spring中的AOP及AspectJ五大通知注解,AOP面向切面編程是一種新的方法論,是對(duì)傳統(tǒng)OOP面向?qū)ο缶幊痰难a(bǔ)充,AOP?的主要編程對(duì)象是切面(aspect),切面模塊化橫切關(guān)注點(diǎn),需要的朋友可以參考下
    2023-08-08
  • 選擇java的理由:java之父訪談實(shí)錄

    選擇java的理由:java之父訪談實(shí)錄

    選擇java的理由:java之父訪談實(shí)錄...
    2006-12-12
  • Java面試官最喜歡問的關(guān)鍵字之volatile詳解

    Java面試官最喜歡問的關(guān)鍵字之volatile詳解

    這篇文章主要給大家介紹了關(guān)于Java面試官最喜歡問的關(guān)鍵字之volatile的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • idea中使用maven?archetype新建項(xiàng)目時(shí)卡住問題解決方案

    idea中使用maven?archetype新建項(xiàng)目時(shí)卡住問題解決方案

    這篇文章主要介紹了idea中使用maven?archetype新建項(xiàng)目時(shí)卡住,解決本問題的方法,就是在maven的runner加上參數(shù)-DarchetypeCatalog=local就可以了,不需要下載xml文件再放到指定目錄,需要的朋友可以參考下
    2023-08-08
  • Spring 開發(fā)之組件賦值的實(shí)現(xiàn)方法

    Spring 開發(fā)之組件賦值的實(shí)現(xiàn)方法

    這篇文章主要介紹了Spring 開發(fā)之組件賦值的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java技術(shù)匯總

    Java技術(shù)匯總

    本篇文章主要對(duì)Java基本知識(shí)點(diǎn)和技術(shù)點(diǎn)的一些看法和介紹,具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • MapReduce中ArrayWritable 使用指南

    MapReduce中ArrayWritable 使用指南

    MapReduce是一種編程模型,用于大規(guī)模數(shù)據(jù)集的并行運(yùn)算。概念"Map(映射)"和"Reduce(歸約)"和他們的主要思想,都是從函數(shù)式編程語(yǔ)言里借來的,還有從矢量編程語(yǔ)言里借來的特性。他極大地方便了編程人員在不會(huì)分布式并行編程的情況下,將自己的程序運(yùn)行在分布式系統(tǒng)上。
    2014-08-08
  • Java提取2個(gè)集合中的相同和不同元素代碼示例

    Java提取2個(gè)集合中的相同和不同元素代碼示例

    這篇文章主要介紹了Java提取2個(gè)集合中的相同和不同元素代碼示例,涉及對(duì)removeall方法的簡(jiǎn)單介紹,然后分享了主要的示例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • Java實(shí)現(xiàn)國(guó)產(chǎn)加密算法SM4的示例詳解

    Java實(shí)現(xiàn)國(guó)產(chǎn)加密算法SM4的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)國(guó)產(chǎn)加密算法SM4(ECB和CBC兩種模式),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-01-01

最新評(píng)論