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

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

 更新時(shí)間:2017年06月12日 15:34:07   作者:skywang12345  
本篇文章主要介紹了Java concurrency之非公平鎖,詳細(xì)的介紹了獲取和釋放非公平鎖,有興趣的同學(xué)可以了解一下

獲取非公平鎖(基于JDK1.7.0_40)

非公平鎖和公平鎖在獲取鎖的方法上,流程是一樣的;它們的區(qū)別主要表現(xiàn)在“嘗試獲取鎖的機(jī)制不同”。簡(jiǎn)單點(diǎn)說,“公平鎖”在每次嘗試獲取鎖時(shí),都是采用公平策略(根據(jù)等待隊(duì)列依次排序等待);而“非公平鎖”在每次嘗試獲取鎖時(shí),都是采用的非公平策略(無(wú)視等待隊(duì)列,直接嘗試獲取鎖,如果鎖是空閑的,即可獲取狀態(tài),則獲取鎖)。 

1. lock()

lock()在ReentrantLock.java的NonfairSync類中實(shí)現(xiàn),它的源碼如下:
final void lock() {
  if (compareAndSetState(0, 1))
    setExclusiveOwnerThread(Thread.currentThread());
  else
    acquire(1);
}

說明:

lock()會(huì)先通過compareAndSet(0, 1)來判斷“鎖”是不是空閑狀態(tài)。是的話,“當(dāng)前線程”直接獲取“鎖”;否則的話,調(diào)用acquire(1)獲取鎖。

(01) compareAndSetState()是CAS函數(shù),它的作用是比較并設(shè)置當(dāng)前鎖的狀態(tài)。若鎖的狀態(tài)值為0,則設(shè)置鎖的狀態(tài)值為1。

(02) setExclusiveOwnerThread(Thread.currentThread())的作用是,設(shè)置“當(dāng)前線程”為“鎖”的持有者。

“公平鎖”和“非公平鎖”關(guān)于lock()的對(duì)比

  1. 公平鎖   -- 公平鎖的lock()函數(shù),會(huì)直接調(diào)用acquire(1)。
  2. 非公平鎖 -- 非公平鎖會(huì)先判斷當(dāng)前鎖的狀態(tài)是不是空閑,是的話,就不排隊(duì),而是直接獲取鎖。

2. acquire()

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

public final void acquire(int arg) {
  if (!tryAcquire(arg) &&
    acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
    selfInterrupt();
}

(01) “當(dāng)前線程”首先通過tryAcquire()嘗試獲取鎖。獲取成功的話,直接返回;嘗試失敗的話,進(jìn)入到等待隊(duì)列依次排序,然后獲取鎖。

(02) “當(dāng)前線程”嘗試失敗的情況下,會(huì)先通過addWaiter(Node.EXCLUSIVE)來將“當(dāng)前線程”加入到"CLH隊(duì)列(非阻塞的FIFO隊(duì)列)"末尾。

(03) 然后,調(diào)用acquireQueued()獲取鎖。在acquireQueued()中,當(dāng)前線程會(huì)等待它在“CLH隊(duì)列”中前面的所有線程執(zhí)行并釋放鎖之后,才能獲取鎖并返回。如果“當(dāng)前線程”在休眠等待過程中被中斷過,則調(diào)用selfInterrupt()來自己產(chǎn)生一個(gè)中斷。

“公平鎖”和“非公平鎖”關(guān)于acquire()的對(duì)比

公平鎖和非公平鎖,只有tryAcquire()函數(shù)的實(shí)現(xiàn)不同;即它們嘗試獲取鎖的機(jī)制不同。這就是我們所說的“它們獲取鎖策略的不同所在之處”!

非公平鎖的tryAcquire()在ReentrantLock.java的NonfairSync類中實(shí)現(xiàn),源碼如下:

protected final boolean tryAcquire(int acquires) {
  return nonfairTryAcquire(acquires);
}

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

final boolean nonfairTryAcquire(int acquires) {
  // 獲取“當(dāng)前線程”
  final Thread current = Thread.currentThread();
  // 獲取“鎖”的狀態(tài)
  int c = getState();
  // c=0意味著“鎖沒有被任何線程鎖擁有”
  if (c == 0) {
    // 若“鎖沒有被任何線程鎖擁有”,則通過CAS函數(shù)設(shè)置“鎖”的狀態(tài)為acquires。
    // 同時(shí),設(shè)置“當(dāng)前線程”為鎖的持有者。
    if (compareAndSetState(0, acquires)) {
      setExclusiveOwnerThread(current);
      return true;
    }
  }
  else if (current == getExclusiveOwnerThread()) {
    // 如果“鎖”的持有者已經(jīng)是“當(dāng)前線程”,
    // 則將更新鎖的狀態(tài)。
    int nextc = c + acquires;
    if (nextc < 0) // overflow
      throw new Error("Maximum lock count exceeded");
    setState(nextc);
    return true;
  }
  return false;
}

說明:

根據(jù)代碼,我們可以分析出,tryAcquire()的作用就是嘗試去獲取鎖。

(01) 如果“鎖”沒有被任何線程擁有,則通過CAS函數(shù)設(shè)置“鎖”的狀態(tài)為acquires,同時(shí),設(shè)置“當(dāng)前線程”為鎖的持有者,然后返回true。

(02) 如果“鎖”的持有者已經(jīng)是當(dāng)前線程,則將更新鎖的狀態(tài)即可。

(03) 如果不術(shù)語(yǔ)上面的兩種情況,則認(rèn)為嘗試失敗。

“公平鎖”和“非公平鎖”關(guān)于tryAcquire()的對(duì)比
公平鎖和非公平鎖,它們嘗試獲取鎖的方式不同。

公平鎖在嘗試獲取鎖時(shí),即使“鎖”沒有被任何線程鎖持有,它也會(huì)判斷自己是不是CLH等待隊(duì)列的表頭;是的話,才獲取鎖。

而非公平鎖在嘗試獲取鎖時(shí),如果“鎖”沒有被任何線程持有,則不管它在CLH隊(duì)列的何處,它都直接獲取鎖。

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

非公平鎖和公平鎖在釋放鎖的方法和策略上是一樣的。

總結(jié)

公平鎖和非公平鎖的區(qū)別,是在獲取鎖的機(jī)制上的區(qū)別。表現(xiàn)在,在嘗試獲取鎖時(shí) —— 公平鎖,只有在當(dāng)前線程是CLH等待隊(duì)列的表頭時(shí),才獲取鎖;而非公平鎖,只要當(dāng)前鎖處于空閑狀態(tài),則直接獲取鎖,而不管CLH等待隊(duì)列中的順序。

只有當(dāng)非公平鎖嘗試獲取鎖失敗的時(shí)候,它才會(huì)像公平鎖一樣,進(jìn)入CLH等待隊(duì)列排序等待。

相關(guān)文章

  • Java 反轉(zhuǎn)帶頭結(jié)點(diǎn)的單鏈表并顯示輸出的實(shí)現(xiàn)過程

    Java 反轉(zhuǎn)帶頭結(jié)點(diǎn)的單鏈表并顯示輸出的實(shí)現(xiàn)過程

    這篇文章主要介紹了Java 反轉(zhuǎn)帶頭結(jié)點(diǎn)的單鏈表并顯示輸出,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • SpringBoot實(shí)現(xiàn)文件上傳下載功能小結(jié)

    SpringBoot實(shí)現(xiàn)文件上傳下載功能小結(jié)

    最近做的一個(gè)項(xiàng)目涉及到文件上傳與下載功能。SpringBoot后臺(tái)如何實(shí)現(xiàn)文件上傳下載呢?下面有單文件上傳和多文件上傳功能,感興趣的朋友一起看看吧
    2017-08-08
  • java內(nèi)部類使用總結(jié)

    java內(nèi)部類使用總結(jié)

    本文主要介紹了java內(nèi)部類使用總結(jié)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • SpringCache的簡(jiǎn)介和使用教程

    SpringCache的簡(jiǎn)介和使用教程

    緩存是實(shí)際工作中經(jīng)常使用的一種提高性能的方法,?我們會(huì)在很多場(chǎng)景下來使用緩存,而spring-cache就是一種簡(jiǎn)單的實(shí)現(xiàn)。通過本文學(xué)習(xí)可以了解SpringCache的簡(jiǎn)介和使用方法,感興趣的朋友一起看看吧
    2021-11-11
  • Spring Boot 中的 @Field 注解的原理解析

    Spring Boot 中的 @Field 注解的原理解析

    本文詳細(xì)介紹了 Spring Boot 中的 @Field 注解的原理和使用方法,通過使用 @Field 注解,我們可以將 HTTP 請(qǐng)求中的參數(shù)值自動(dòng)綁定到 Java 對(duì)象的屬性上,簡(jiǎn)化了開發(fā)過程,提高了開發(fā)效率,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • 基于紅黑樹插入操作原理及java實(shí)現(xiàn)方法(分享)

    基于紅黑樹插入操作原理及java實(shí)現(xiàn)方法(分享)

    下面小編就為大家分享一篇基于紅黑樹插入操作原理及java實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java Reference源碼解析

    Java Reference源碼解析

    這篇文章主要為大家詳細(xì)解析了Java Reference源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • mybatis基本實(shí)例詳解

    mybatis基本實(shí)例詳解

    這篇文章主要介紹了mybatis基本實(shí)例詳解以及mybatis自由模糊查詢,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • 使用IDEA搭建MyBatis環(huán)境詳細(xì)過程

    使用IDEA搭建MyBatis環(huán)境詳細(xì)過程

    這篇文章主要介紹了使用IDEA搭建MyBatis環(huán)境的相關(guān)知識(shí),包括創(chuàng)建項(xiàng)目的過程及導(dǎo)入mybatis的核心jar包的詳細(xì)說明,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-05-05
  • 使用Spring的注解方式實(shí)現(xiàn)AOP實(shí)例

    使用Spring的注解方式實(shí)現(xiàn)AOP實(shí)例

    本篇文章主要介紹了使用Spring的注解方式實(shí)現(xiàn)AOP實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06

最新評(píng)論

来安县| 黄陵县| 来宾市| 桓台县| 漳平市| 孟村| 祥云县| 措美县| 廉江市| 滦南县| 潍坊市| 双江| 当雄县| 武邑县| 胶州市| 紫金县| 乳源| 清河县| 新丰县| 汝州市| 甘洛县| 化隆| 通辽市| 玛纳斯县| 斗六市| 鹿泉市| 乐都县| 双柏县| 乌苏市| 正阳县| 阜城县| 平武县| 静安区| 大余县| 琼结县| 闵行区| 南澳县| 囊谦县| 青浦区| 大姚县| 扎囊县|