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

synchronized及JUC顯式locks?使用原理解析

 更新時間:2022年12月26日 08:53:30   作者:Applehope  
這篇文章主要為大家介紹了synchronized及JUC顯式locks?使用原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一、synchronized 有不足

新事物的出現(xiàn)要不是替代老事物,要么就是對老事物的補充

JUC 的 locks 就是對 synchronized 的補充

  • 從開始競爭鎖 到拿到鎖這段時間,調用線程一直是阻塞狀態(tài),啥都干不了
  • 已經(jīng)占有的資源也釋放不了,別的線程也無法獲得;這種不可搶占的情況,更容易帶來死鎖(死鎖產(chǎn)生的原理就是:我占著你要用的資源不給你,你卻不能搶)
  • 只有一個條件變量(條件等待隊列),用于線程間的協(xié)調、通信

二、改進意見

采用更多的措施以避免死鎖 :

不能搶占 變?yōu)?可搶占,占用部分資源的線程進一步申請其他資源時

  • 如果能快速申請到,就申請
  • 如果不能快速申請到,可以主動釋放它占有的資源

使用者自己可創(chuàng)建多個條件變量,用于線程間的協(xié)調、通信。

三、可搶占的方法論

3.1 能夠響應中斷

synchronized 的問題是:持有鎖 A 后,如果嘗試獲取鎖 B 失敗,那么線程就進入阻塞狀態(tài),一旦發(fā)生死鎖,就沒有任何機會來喚醒阻塞的線程。但如果阻塞狀態(tài)的線程能夠響應中斷信號,也就是說當我們給阻塞的線程發(fā)送中斷信號的時候,能夠喚醒它,那它就有機會釋放曾經(jīng)持有的鎖 A。這樣就破壞了不可搶占條件了。

3.2 支持超時

如果線程在一段時間之內(nèi)沒有獲取到鎖,不是進入阻塞狀態(tài),而是返回一個錯誤,那這個線程也有機會釋放曾經(jīng)持有的鎖。這樣也能破壞不可搶占條件。

3.3 非阻塞地獲取鎖

如果嘗試獲取鎖失敗,并不進入阻塞狀態(tài),而是直接返回,那這個線程也有機會釋放曾經(jīng)持有的鎖。這樣也能破壞不可搶占條件。

四、可搶占的實現(xiàn) - JUC 的 locks

// 支持中斷的API
void lockInterruptibly() throws InterruptedException;
// 支持超時的API
boolean tryLock(long time, TimeUnit unit)  throws InterruptedException;
// 支持非阻塞獲取鎖的API
boolean tryLock();

五、多個 Condition(條件變量或條件等待隊列)

等效于管程中的條件變量,條件變量用于線程間的同步。通過java.util.concurrent.locks.Lock#newCondition()來創(chuàng)建,每個 Condition 都具有一個 waitSet;這樣鎖對象就具備了多個waitSet; Condition 提供了以下方法:用于線程的協(xié)作(線程等待/激活)。

//線程加入此條件變量的等待隊列;類似Object.wait();使用時也要放到while循環(huán)體內(nèi)。
java.util.concurrent.locks.Condition#await()
java.util.concurrent.locks.Condition#awaitUninterruptibly()
java.util.concurrent.locks.Condition#awaitNanos()
java.util.concurrent.locks.Condition#await(long, java.util.concurrent.TimeUnit)
java.util.concurrent.locks.Condition#awaitUntil()
//激活此條件變量中的一個線程;類似Object.notify()
java.util.concurrent.locks.Condition#signal()
//激活此條件變量中的所有線程;類似Object.notifyAll()
java.util.concurrent.locks.Condition#signalAll()

java doc 示例:一個有界緩沖,兩個條件等待隊列,分別被生產(chǎn)者線程和消費者線程來使用。

  • 生產(chǎn)者線程在 notFull 條件隊列中等待;意思為生產(chǎn)者線程要阻塞等待,直到 有界緩沖不是滿的,才能 put
  • 消費者線程在 notEmpty 條件隊列中等待;意思為消費者線程要阻塞等待,直到有界緩沖不是空的,才能 take
class BoundedBuffer {
 final Lock lock = new ReentrantLock();
 final Condition notFull  = lock.newCondition();
 final Condition notEmpty = lock.newCondition();
 final Object[] items = new Object[100];
 int putptr, takeptr, count;
 public void put(Object x) throws InterruptedException {
   lock.lock();
   try {
     while (count == items.length)
       notFull.await();
     items[putptr] = x;
     if (++putptr == items.length) putptr = 0;
     ++count;
     notEmpty.signal();
   } finally {
     lock.unlock();
   }
 }
 public Object take() throws InterruptedException {
   lock.lock();
   try {
     while (count == 0)
       notEmpty.await();
     Object x = items[takeptr];
     if (++takeptr == items.length) takeptr = 0;
     --count;
     notFull.signal();
     return x;
   } finally {
     lock.unlock();
   }
 }
}

六、JUC中l(wèi)ocks的使用規(guī)范

6.1 保證鎖的釋放

 Lock l = ...;
 l.lock();
 try {
   // access the resource protected by this lock
 } finally {
   l.unlock();
 }
 Lock lock = ...;
 if (lock.tryLock()) {
   try {
     // manipulate protected state
   } finally {
     lock.unlock();
   }
 } else {
   // perform alternative actions
 }

6.2 循環(huán)體中使用 await()

while (XXX)
    condition.await();

6.3 同步代碼塊中使用 await()

必須先持有鎖

 l.lock();
 try {
    ...
    while (XXX)
      condition.await();
    ...
 } finally {
   l.unlock();
 }

以上就是synchronized及JUC顯式locks 使用原理解析的詳細內(nèi)容,更多關于synchronized JUC顯式locks 的資料請關注腳本之家其它相關文章!

相關文章

  • Java中設置JAVA_HOME無效的解決方法

    Java中設置JAVA_HOME無效的解決方法

    最近遇到一個問題,就是配置JAVA_HOME無效,不管怎么改,運行Java -version始終是最初的那個java版本,所以這篇文章主要給大家介紹了關于Java中設置JAVA_HOME無效的解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • 解析Spring中面向切面編程

    解析Spring中面向切面編程

    如果說 IoC 是 Spring 的核心,那么面向切面編程就是 Spring 最為重要的功能之一了,在數(shù)據(jù)庫事務中切面編程被廣泛使用
    2021-06-06
  • java實戰(zhàn)案例之用戶注冊并發(fā)送郵件激活/發(fā)送郵件驗證碼

    java實戰(zhàn)案例之用戶注冊并發(fā)送郵件激活/發(fā)送郵件驗證碼

    現(xiàn)在很多的網(wǎng)站都提供有用戶注冊功能,當我們注冊成功之后就會收到封注冊網(wǎng)站的郵件,郵件里包含了我們的注冊的用戶名和密碼及激活賬戶的超鏈接等信息,這篇文章主要給大家介紹了關于java實戰(zhàn)案例之用戶注冊并發(fā)送郵件激活/發(fā)送郵件驗證碼的相關資料,需要的朋友可以參考下
    2021-09-09
  • Spring?MVC請求轉發(fā)與請求重定向的示例詳解

    Spring?MVC請求轉發(fā)與請求重定向的示例詳解

    轉發(fā)指服務器接收請求后,從一個資源跳轉到另一個資源中,請求轉發(fā)是一次請求,不會改變?yōu)g覽器的請求地址,這篇文章主要介紹了Spring?MVC請求轉發(fā)與請求重定向的相關知識,需要的朋友可以參考下
    2023-09-09
  • java中的靜態(tài)代碼塊、構造代碼塊、構造方法詳解

    java中的靜態(tài)代碼塊、構造代碼塊、構造方法詳解

    下面小編就為大家?guī)硪黄猨ava中的靜態(tài)代碼塊、構造代碼塊、構造方法詳解。小編覺得挺好的,現(xiàn)在分享給大家。給大家一個參考。一起跟隨小編過來看看吧
    2016-03-03
  • Java模擬計算機的整數(shù)乘積計算功能示例

    Java模擬計算機的整數(shù)乘積計算功能示例

    這篇文章主要介紹了Java模擬計算機的整數(shù)乘積計算功能,簡單分析了計算機數(shù)值進制轉換與通過位移進行乘積計算的原理,并結合具體實例給出了java模擬計算機成績運算的相關操作技巧,需要的朋友可以參考下
    2017-09-09
  • Java的并發(fā)編程之CyclicBarrier解析

    Java的并發(fā)編程之CyclicBarrier解析

    這篇文章主要介紹了Java的并發(fā)編程之CyclicBarrier解析,CyclicBarrier支持一個可選的Runnable命令,在一組線程中的最后一個線程到達之后(但在釋放所有線程之前),該命令只在每個屏障點運行一次,需要的朋友可以參考下
    2023-11-11
  • Java讀取網(wǎng)絡文件的實例代碼

    Java讀取網(wǎng)絡文件的實例代碼

    這篇文章主要介紹了Java讀取網(wǎng)絡文件的實例代碼,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • IDEA插件之快速刪除Java代碼中的注釋

    IDEA插件之快速刪除Java代碼中的注釋

    這篇文章主要介紹了IDEA插件之快速刪除Java代碼中的注釋,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 如何使用IDEA的groovy腳本文件生成帶JPA注解的實體類(圖文詳解)

    如何使用IDEA的groovy腳本文件生成帶JPA注解的實體類(圖文詳解)

    這篇文章主要介紹了如何使用IDEA的groovy腳本文件生成帶JPA注解的實體類,本文通過圖文并茂實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07

最新評論

宁波市| 霸州市| 芮城县| 安远县| 谷城县| 河南省| 江源县| 巴马| 衡南县| 镇平县| 克拉玛依市| 无棣县| 金山区| 广州市| 绥江县| 威宁| 漳浦县| 庆城县| 平山县| 陵川县| 巍山| 深州市| 龙胜| 龙游县| 武川县| 印江| 山阳县| 长子县| 文化| 德钦县| 三穗县| 宜兰县| 襄城县| 阿巴嘎旗| 辉南县| 贵德县| 资源县| 清徐县| 普兰县| 九台市| 雷波县|