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

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

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

Semaphore的作用:

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

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

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

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

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

Semaphore的使用:

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

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

下面的代碼就是模擬控制商場廁所的并發(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個共享資源的使用,使用先進先出的公平模式進行共享;公平模式的信號量,先來的先獲得信號量 
    this.lock = new ReentrantLock(true);//公平模式的鎖,先來的先選 
    for(int i=0 ;i<10; i++){ 
      resourceArray[i] = true;//初始化為資源可用的情況 
    } 
  } 
  public void useResource(int userId){ 
 semaphore.acquire(); 
    try{ 
      //semaphore.acquire(); 
      int id = getResourceId();//占到一個坑 
      System.out.print("userId:"+userId+"正在使用資源,資源id:"+id+"\n"); 
      Thread.sleep(100);//do something,相當(dāng)于于使用資源 
      resourceArray[id] = true;//退出這個坑 
    }catch (InterruptedException e){ 
      e.printStackTrace(); 
    }finally { 
      semaphore.release();//釋放信號量,計數(shù)器加1 
    } 
  } 
  private int getResourceId(){ 
    int id = -1; 
 lock.lock();
    try { 
      //lock.lock();//雖然使用了鎖控制同步,但由于只是簡單的一個數(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)建多個資源使用者 
      threads[i] = thread; 
    } 
    for(int i = 0; i < 100; i++){ 
      Thread thread = threads[i]; 
      try { 
        thread.start();//啟動線程 
      }catch (Exception e){ 
        e.printStackTrace(); 
      } 
    } 
  } 
}

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

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

相關(guān)文章

  • 詳解Java線程池的增長過程

    詳解Java線程池的增長過程

    在本篇文章里小編給大家整理的是關(guān)于Java線程池的增長過程以及相關(guān)知識點,需要的朋友們可以參考下。
    2019-08-08
  • 關(guān)于Mybatis的mapper接口函數(shù)重載問題

    關(guān)于Mybatis的mapper接口函數(shù)重載問題

    這篇文章主要介紹了關(guān)于Mybatis的mapper接口函數(shù)重載問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java?Optional用法面試題精講

    Java?Optional用法面試題精講

    這篇文章主要為大家介紹了Java?Optional用法面試題精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Java流程控制語句之If選擇結(jié)構(gòu)

    Java流程控制語句之If選擇結(jié)構(gòu)

    今天繼續(xù)帶大家復(fù)習(xí)Java流程控制語句的相關(guān)知識,本文對If選擇結(jié)構(gòu)作了非常詳細的介紹及代碼示例,對正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • 詳解Java中int和Integer的區(qū)別

    詳解Java中int和Integer的區(qū)別

    這篇文章主要介紹了Java中int和Integer的區(qū)別文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java基礎(chǔ)之spring5新功能學(xué)習(xí)

    Java基礎(chǔ)之spring5新功能學(xué)習(xí)

    這篇文章主要介紹了Java基礎(chǔ)之spring5新功能學(xué)習(xí),文中有非常詳細的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • springboot動態(tài)調(diào)用實現(xiàn)類方式

    springboot動態(tài)調(diào)用實現(xiàn)類方式

    這篇文章主要介紹了springboot動態(tài)調(diào)用實現(xiàn)類方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • AsyncHttpClient的TimeoutTimerTask連接池異步超時

    AsyncHttpClient的TimeoutTimerTask連接池異步超時

    這篇文章主要為大家介紹了AsyncHttpClient的TimeoutTimerTask連接池異步超時源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • java對接微信小程序詳細流程(登錄&獲取用戶信息)

    java對接微信小程序詳細流程(登錄&獲取用戶信息)

    這篇文章主要給大家介紹了關(guān)于java對接微信小程序(登錄&獲取用戶信息)的相關(guān)資料,我們在開發(fā)微信小程序時經(jīng)常需要獲取用戶微信用戶名以及頭像信息,微信提供了專門的接口API用于返回這些信息,需要的朋友可以參考下
    2023-08-08
  • jpa介紹以及在spring boot中使用詳解

    jpa介紹以及在spring boot中使用詳解

    最近在項目中使用了一下jpa,發(fā)現(xiàn)還是挺好用的。這里就來講一下jpa以及在spring boot中的使用。在這里我們先來了解一下jpa,希望能給你帶來幫助
    2021-08-08

最新評論