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

Java中Semaphore(信號(hào)量)的使用方法

 更新時(shí)間:2019年08月04日 14:24:55   作者:大愚若智_  
這篇文章主要介紹了Java中Semaphore(信號(hào)量)的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Semaphore的作用:

在java中,使用了synchronized關(guān)鍵字和Lock鎖實(shí)現(xiàn)了資源的并發(fā)訪問(wèn)控制,在同一時(shí)間只允許唯一了線程進(jìn)入臨界區(qū)訪問(wèn)資源(讀鎖除外),這樣子控制的主要目的是為了解決多個(gè)線程并發(fā)同一資源造成的數(shù)據(jù)不一致的問(wèn)題。在另外一種場(chǎng)景下,一個(gè)資源有多個(gè)副本可供同時(shí)使用,比如打印機(jī)房有多個(gè)打印機(jī)、廁所有多個(gè)坑可供同時(shí)使用,這種情況下,Java提供了另外的并發(fā)訪問(wèn)控制--資源的多副本的并發(fā)訪問(wèn)控制,今天學(xué)習(xí)的信號(hào)量Semaphore即是其中的一種。

Semaphore實(shí)現(xiàn)原理初探:

Semaphore是用來(lái)保護(hù)一個(gè)或者多個(gè)共享資源的訪問(wèn),Semaphore內(nèi)部維護(hù)了一個(gè)計(jì)數(shù)器,其值為可以訪問(wèn)的共享資源的個(gè)數(shù)。一個(gè)線程要訪問(wèn)共享資源,先獲得信號(hào)量,如果信號(hào)量的計(jì)數(shù)器值大于1,意味著有共享資源可以訪問(wèn),則使其計(jì)數(shù)器值減去1,再訪問(wèn)共享資源。

如果計(jì)數(shù)器值為0,線程進(jìn)入休眠。當(dāng)某個(gè)線程使用完共享資源后,釋放信號(hào)量,并將信號(hào)量?jī)?nèi)部的計(jì)數(shù)器加1,之前進(jìn)入休眠的線程將被喚醒并再次試圖獲得信號(hào)量。

就好比一個(gè)廁所管理員,站在門(mén)口,只有廁所有空位,就開(kāi)門(mén)允許與空側(cè)數(shù)量等量的人進(jìn)入廁所。多個(gè)人進(jìn)入廁所后,相當(dāng)于N個(gè)人來(lái)分配使用N個(gè)空位。為避免多個(gè)人來(lái)同時(shí)競(jìng)爭(zhēng)同一個(gè)側(cè)衛(wèi),在內(nèi)部仍然使用鎖來(lái)控制資源的同步訪問(wèn)。

Semaphore的使用:

Semaphore使用時(shí)需要先構(gòu)建一個(gè)參數(shù)來(lái)指定共享資源的數(shù)量,Semaphore構(gòu)造完成后即是獲取Semaphore、共享資源使用完畢后釋放Semaphore。

Semaphore semaphore = new Semaphore(10,true);
semaphore.acquire();
//do something here
semaphore.release();

下面的代碼就是模擬控制商場(chǎng)廁所的并發(fā)使用:

public class ResourceManage { 
  private final Semaphore semaphore ; 
  private boolean resourceArray[]; 
  private final ReentrantLock lock; 
  public ResourceManage() { 
    this.resourceArray = new boolean[10];//存放廁所狀態(tài) 
    this.semaphore = new Semaphore(10,true);//控制10個(gè)共享資源的使用,使用先進(jìn)先出的公平模式進(jìn)行共享;公平模式的信號(hào)量,先來(lái)的先獲得信號(hào)量 
    this.lock = new ReentrantLock(true);//公平模式的鎖,先來(lái)的先選 
    for(int i=0 ;i<10; i++){ 
      resourceArray[i] = true;//初始化為資源可用的情況 
    } 
  } 
  public void useResource(int userId){ 
 semaphore.acquire(); 
    try{ 
      //semaphore.acquire(); 
      int id = getResourceId();//占到一個(gè)坑 
      System.out.print("userId:"+userId+"正在使用資源,資源id:"+id+"\n"); 
      Thread.sleep(100);//do something,相當(dāng)于于使用資源 
      resourceArray[id] = true;//退出這個(gè)坑 
    }catch (InterruptedException e){ 
      e.printStackTrace(); 
    }finally { 
      semaphore.release();//釋放信號(hào)量,計(jì)數(shù)器加1 
    } 
  } 
  private int getResourceId(){ 
    int id = -1; 
 lock.lock();
    try { 
      //lock.lock();//雖然使用了鎖控制同步,但由于只是簡(jiǎn)單的一個(gè)數(shù)組遍歷,效率還是很高的,所以基本不影響性能。 
      for(int i=0; i<10; i++){ 
        if(resourceArray[i]){ 
          resourceArray[i] = false; 
          id = i; 
          break; 
        } 
      } 
    }catch (Exception e){ 
      e.printStackTrace(); 
    }finally { 
      lock.unlock(); 
    } 
    return id; 
  } 
} 
public class ResourceUser implements Runnable{ 
  private ResourceManage resourceManage; 
  private int userId; 
  public ResourceUser(ResourceManage resourceManage, int userId) { 
    this.resourceManage = resourceManage; 
    this.userId = userId; 
  } 
  public void run(){ 
    System.out.print("userId:"+userId+"準(zhǔn)備使用資源...\n"); 
    resourceManage.useResource(userId); 
    System.out.print("userId:"+userId+"使用資源完畢...\n"); 
  } 
 
  public static void main(String[] args){ 
    ResourceManage resourceManage = new ResourceManage(); 
    Thread[] threads = new Thread[100]; 
    for (int i = 0; i < 100; i++) { 
      Thread thread = new Thread(new ResourceUser(resourceManage,i));//創(chuàng)建多個(gè)資源使用者 
      threads[i] = thread; 
    } 
    for(int i = 0; i < 100; i++){ 
      Thread thread = threads[i]; 
      try { 
        thread.start();//啟動(dòng)線程 
      }catch (Exception e){ 
        e.printStackTrace(); 
      } 
    } 
  } 
}

最后,Semaphore除了控制資源的多個(gè)副本的并發(fā)訪問(wèn)控制,也可以使用二進(jìn)制信號(hào)量來(lái)實(shí)現(xiàn)類(lèi)似synchronized關(guān)鍵字和Lock鎖的并發(fā)訪問(wèn)控制功能。

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

相關(guān)文章

  • Java解決No enclosing instance of type PrintListFromTailToHead is accessible問(wèn)題的兩種方案

    Java解決No enclosing instance of type PrintListFromTailToHead

    這篇文章主要介紹了Java解決No enclosing instance of type PrintListFromTailToHead is accessible問(wèn)題的兩種方案的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • 使用Java實(shí)現(xiàn)簽字功能的示例代碼

    使用Java實(shí)現(xiàn)簽字功能的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)簽字功能,同時(shí)支持將簽字圖像保存為PNG格式和將簽字添加到PDF文檔中,感興趣的可以了解下
    2024-02-02
  • 淺談Java安全之C3P0的使用

    淺談Java安全之C3P0的使用

    本文主要介紹了淺談Java安全之C3P0的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java報(bào)錯(cuò)java.awt.AWTException: AWT的解決方法

    Java報(bào)錯(cuò)java.awt.AWTException: AWT的解決方法

    在Java圖形用戶界面(GUI)編程中,java.awt.AWTException是一個(gè)常見(jiàn)的異常,它通常與AWT(Abstract Window Toolkit)組件相關(guān),這個(gè)異常可能在嘗試進(jìn)行與窗口、圖形環(huán)境或系統(tǒng)剪貼板等操作時(shí)拋出,本文將詳細(xì)探討AWTException的成因,并提供多種解決方案
    2024-12-12
  • Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之醫(yī)院心理咨詢問(wèn)診系統(tǒng)的實(shí)現(xiàn)

    Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之醫(yī)院心理咨詢問(wèn)診系統(tǒng)的實(shí)現(xiàn)

    這是一個(gè)使用了java+Spring+Maven+mybatis+Vue+mysql開(kāi)發(fā)的醫(yī)院心理咨詢問(wèn)診系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有心理咨詢問(wèn)診該有的所有功能,感興趣的朋友快來(lái)看看吧
    2022-01-01
  • Java線程中的關(guān)鍵字和方法示例詳解

    Java線程中的關(guān)鍵字和方法示例詳解

    這篇文章主要介紹了Java有關(guān)線程中的關(guān)鍵字和方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • 解決IDEA顯示非法字符 \ufeff 的問(wèn)題

    解決IDEA顯示非法字符 \ufeff 的問(wèn)題

    這篇文章主要介紹了解決IDEA顯示非法字符 \ufeff 的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • java實(shí)現(xiàn)單鏈表中是否有環(huán)的方法詳解

    java實(shí)現(xiàn)單鏈表中是否有環(huán)的方法詳解

    本篇文章介紹了,用java實(shí)現(xiàn)單鏈表中是否有環(huán)的方法詳解。需要的朋友參考下
    2013-05-05
  • Spring MVC學(xué)習(xí)筆記之Controller查找(基于Spring4.0.3)

    Spring MVC學(xué)習(xí)筆記之Controller查找(基于Spring4.0.3)

    這篇文章主要給大家介紹了關(guān)于Spring MVC學(xué)習(xí)筆記之Controller查找(基于Spring4.0.3)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Java開(kāi)發(fā)實(shí)現(xiàn)飛機(jī)大戰(zhàn)

    Java開(kāi)發(fā)實(shí)現(xiàn)飛機(jī)大戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了Java開(kāi)發(fā)實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論

嘉禾县| 定州市| 黄浦区| 明光市| 梁河县| 纳雍县| 金寨县| 安达市| 婺源县| 高邮市| 商丘市| 谷城县| 昌平区| 赤水市| 西畴县| 大竹县| 吕梁市| 崇州市| 泰顺县| 册亨县| 宜城市| 苍溪县| 凌云县| 绥德县| 襄城县| 西林县| 鹿邑县| 伊宁县| 榆林市| 元阳县| 龙里县| 拉孜县| 宁晋县| 玛纳斯县| 宜阳县| 桂阳县| 南漳县| 葫芦岛市| 高青县| 金塔县| 平山县|