最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java concurrency之公平鎖(二)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年06月12日 15:48:08   作者:skywang12345  
這篇文章主要為大家詳細(xì)介紹了Java concurrency之公平鎖的第二篇內(nèi)容,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

釋放公平鎖(基于JDK1.7.0_40)

1. unlock()

unlock()在ReentrantLock.java中實(shí)現(xiàn)的,源碼如下:

public void unlock() {
  sync.release(1);
}

說明:

unlock()是解鎖函數(shù),它是通過AQS的release()函數(shù)來實(shí)現(xiàn)的。
在這里,“1”的含義和“獲取鎖的函數(shù)acquire(1)的含義”一樣,它是設(shè)置“釋放鎖的狀態(tài)”的參數(shù)。由于“公平鎖”是可重入的,所以對(duì)于同一個(gè)線程,每釋放鎖一次,鎖的狀態(tài)-1。

關(guān)于AQS, ReentrantLock 和 sync的關(guān)系如下:

public class ReentrantLock implements Lock, java.io.Serializable {

  private final Sync sync;

  abstract static class Sync extends AbstractQueuedSynchronizer {
    ...
  }

  ...
}

從中,我們發(fā)現(xiàn):sync是ReentrantLock.java中的成員對(duì)象,而Sync是AQS的子類。 

2. release()

release()在AQS中實(shí)現(xiàn)的,源碼如下:

public final boolean release(int arg) {
  if (tryRelease(arg)) {
    Node h = head;
    if (h != null && h.waitStatus != 0)
      unparkSuccessor(h);
    return true;
  }
  return false;
}

說明:

release()會(huì)先調(diào)用tryRelease()來嘗試釋放當(dāng)前線程鎖持有的鎖。成功的話,則喚醒后繼等待線程,并返回true。否則,直接返回false。 

3. tryRelease()

tryRelease()在ReentrantLock.java的Sync類中實(shí)現(xiàn),源碼如下:

protected final boolean tryRelease(int releases) {
  // c是本次釋放鎖之后的狀態(tài)
  int c = getState() - releases;
  // 如果“當(dāng)前線程”不是“鎖的持有者”,則拋出異常!
  if (Thread.currentThread() != getExclusiveOwnerThread())
    throw new IllegalMonitorStateException();

  boolean free = false;
  // 如果“鎖”已經(jīng)被當(dāng)前線程徹底釋放,則設(shè)置“鎖”的持有者為null,即鎖是可獲取狀態(tài)。
  if (c == 0) {
    free = true;
    setExclusiveOwnerThread(null);
  }
  // 設(shè)置當(dāng)前線程的鎖的狀態(tài)。
  setState(c);
  return free;
}

說明:

tryRelease()的作用是嘗試釋放鎖。
(01) 如果“當(dāng)前線程”不是“鎖的持有者”,則拋出異常。
(02) 如果“當(dāng)前線程”在本次釋放鎖操作之后,對(duì)鎖的擁有狀態(tài)是0(即,當(dāng)前線程徹底釋放該“鎖”),則設(shè)置“鎖”的持有者為null,即鎖是可獲取狀態(tài)。同時(shí),更新當(dāng)前線程的鎖的狀態(tài)為0。
getState(), setState()在前一章已經(jīng)介紹過,這里不再說明。
getExclusiveOwnerThread(), setExclusiveOwnerThread()在AQS的父類AbstractOwnableSynchronizer.java中定義,源碼如下:

public abstract class AbstractOwnableSynchronizer
  implements java.io.Serializable {

  // “鎖”的持有線程
  private transient Thread exclusiveOwnerThread;

  // 設(shè)置“鎖的持有線程”為t
  protected final void setExclusiveOwnerThread(Thread t) {
    exclusiveOwnerThread = t;
  }

  // 獲取“鎖的持有線程”
  protected final Thread getExclusiveOwnerThread() {
    return exclusiveOwnerThread;
  }
  
  ...
}

4. unparkSuccessor()

在release()中“當(dāng)前線程”釋放鎖成功的話,會(huì)喚醒當(dāng)前線程的后繼線程。
根據(jù)CLH隊(duì)列的FIFO規(guī)則,“當(dāng)前線程”(即已經(jīng)獲取鎖的線程)肯定是head;如果CLH隊(duì)列非空的話,則喚醒鎖的下一個(gè)等待線程。

下面看看unparkSuccessor()的源碼,它在AQS中實(shí)現(xiàn)。

private void unparkSuccessor(Node node) {
  // 獲取當(dāng)前線程的狀態(tài)
  int ws = node.waitStatus;
  // 如果狀態(tài)<0,則設(shè)置狀態(tài)=0
  if (ws < 0)
    compareAndSetWaitStatus(node, ws, 0);

  //獲取當(dāng)前節(jié)點(diǎn)的“有效的后繼節(jié)點(diǎn)”,無效的話,則通過for循環(huán)進(jìn)行獲取。
  // 這里的有效,是指“后繼節(jié)點(diǎn)對(duì)應(yīng)的線程狀態(tài)<=0”
  Node s = node.next;
  if (s == null || s.waitStatus > 0) {
    s = null;
    for (Node t = tail; t != null && t != node; t = t.prev)
      if (t.waitStatus <= 0)
        s = t;
  }
  // 喚醒“后繼節(jié)點(diǎn)對(duì)應(yīng)的線程”
  if (s != null)
    LockSupport.unpark(s.thread);
}

說明:

unparkSuccessor()的作用是“喚醒當(dāng)前線程的后繼線程”。后繼線程被喚醒之后,就可以獲取該鎖并恢復(fù)運(yùn)行了。

關(guān)于node.waitStatus的說明,請(qǐng)參考“上一章關(guān)于Node類的介紹”。

 總結(jié)

“釋放鎖”的過程相對(duì)“獲取鎖”的過程比較簡單。釋放鎖時(shí),主要進(jìn)行的操作,是更新當(dāng)前線程對(duì)應(yīng)的鎖的狀態(tài)。如果當(dāng)前線程對(duì)鎖已經(jīng)徹底釋放,則設(shè)置“鎖”的持有線程為null,設(shè)置當(dāng)前線程的狀態(tài)為空,然后喚醒后繼線程。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Swagger注解-@ApiModel和@ApiModelProperty的用法

    Swagger注解-@ApiModel和@ApiModelProperty的用法

    這篇文章主要介紹了Swagger注解-@ApiModel和@ApiModelProperty的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 必須了解的高階JAVA枚舉特性!

    必須了解的高階JAVA枚舉特性!

    這篇文章主要介紹了必須了解的高階JAVA枚舉特性!幫助大家更好的理解和學(xué)習(xí)Java枚舉的相關(guān)知識(shí),感興趣的朋友可以了解下
    2021-01-01
  • SpringBoot實(shí)現(xiàn)圖片識(shí)別文字的四種方式小結(jié)

    SpringBoot實(shí)現(xiàn)圖片識(shí)別文字的四種方式小結(jié)

    本文主要介紹了SpringBoot實(shí)現(xiàn)圖片識(shí)別文字的四種方式,包括Tess4J,百度智能云,阿里云,騰訊云這四種,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • springmvc mybatis集成配置示例

    springmvc mybatis集成配置示例

    本文主要介紹springmvc+mybatis集成配置,這里提供了實(shí)例代碼,和簡單說明,有需要的小伙伴可以參考下
    2016-09-09
  • SpringKafka消息發(fā)布之KafkaTemplate與事務(wù)支持功能

    SpringKafka消息發(fā)布之KafkaTemplate與事務(wù)支持功能

    通過本文介紹的基本用法、序列化選項(xiàng)、事務(wù)支持、錯(cuò)誤處理和性能優(yōu)化技術(shù),開發(fā)者可以構(gòu)建高效可靠的Kafka消息發(fā)布系統(tǒng),事務(wù)支持特性尤為重要,它確保了在分布式環(huán)境中的數(shù)據(jù)一致性,感興趣的朋友一起看看吧
    2025-04-04
  • 深入了解Java接口回調(diào)機(jī)制

    深入了解Java接口回調(diào)機(jī)制

    這篇文章主要介紹了Java接口回調(diào)機(jī)制,下面我們來一起學(xué)習(xí)一下吧
    2019-05-05
  • 深入探究Spring底層核心原理

    深入探究Spring底層核心原理

    理解IOC與AOP的實(shí)現(xiàn)機(jī)制,優(yōu)化應(yīng)用性能與可維護(hù)性。Spring通過IOC容器管理Bean,AOP實(shí)現(xiàn)切面編程,支持事務(wù)管理、ORM框架等。深入理解Spring原理,可以幫助我們更好地使用Spring框架,提高開發(fā)效率與質(zhì)量
    2023-04-04
  • Java中Maven項(xiàng)目導(dǎo)出jar包配置的示例代碼

    Java中Maven項(xiàng)目導(dǎo)出jar包配置的示例代碼

    這篇文章主要介紹了Java中Maven項(xiàng)目導(dǎo)出jar包配置的示例代碼,需要的朋友可以參考下
    2018-11-11
  • MyEclipse10安裝Log4E插件

    MyEclipse10安裝Log4E插件

    這篇文章主要介紹了MyEclipse10安裝Log4E插件的相關(guān)資料,需要的朋友可以參考下
    2017-10-10
  • 如何將maven項(xiàng)目劃分為多個(gè)模塊

    如何將maven項(xiàng)目劃分為多個(gè)模塊

    這篇文章主要介紹了如何將maven項(xiàng)目劃分為多個(gè)模塊,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09

最新評(píng)論

德令哈市| 凌海市| 林周县| 昭通市| 化州市| 莲花县| 家居| 重庆市| 乌兰县| 牡丹江市| 五峰| 乐东| 龙胜| 揭阳市| 阜宁县| 汝南县| 巴青县| 施秉县| 沐川县| 汝城县| 金湖县| 北安市| 化隆| 肇庆市| 翁牛特旗| 新乐市| 马龙县| 孟州市| 壶关县| 元朗区| 浏阳市| 铁岭县| 龙陵县| 福鼎市| 石景山区| 夏河县| 崇义县| 巴里| 宜良县| 胶州市| 视频|