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

JAVA 多線程之信號量(Semaphore)實例詳解

 更新時間:2017年01月18日 10:35:04   投稿:lqh  
這篇文章主要介紹了JAVA 多線程之信號量(Semaphore)實例詳解的相關(guān)資料,需要的朋友可以參考下

java Semaphore

簡介

        信號量(Semaphore),有時被稱為信號燈,是在多線程環(huán)境下使用的一種設施, 它負責協(xié)調(diào)各個線程, 以保證它們能夠正確、合理的使用公共資源。

        一個計數(shù)信號量。從概念上講,信號量維護了一個許可集。如有必要,在許可可用前會阻塞每一個 acquire(),然后再獲取該許可。每個 release() 添加一個許可,從而可能釋放一個正在阻塞的獲取者。但是,不使用實際的許可對象,Semaphore 只對可用許可的號碼進行計數(shù),并采取相應的行動。拿到信號量的線程可以進入代碼,否則就等待。通過acquire()和release()獲取和釋放訪問許可。

概念

        Semaphore分為單值和多值兩種,前者只能被一個線程獲得,后者可以被若干個線程獲得。

     以一個停車場運作為例。為了簡單起見,假設停車場只有三個車位,一開始三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛不受阻礙的進入,然后放下車攔,剩下的車則必須在入口等待,此后來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知后,打開車攔,放入一輛,如果又離開兩輛,則又可以放入兩輛,如此往復。

    在這個停車場系統(tǒng)中,車位是公共資源,每輛車好比一個線程,看門人起的就是信號量的作用。

    更進一步,信號量的特性如下:信號量是一個非負整數(shù)(車位數(shù)),所有通過它的線程(車輛)都會將該整數(shù)減一(通過它當然是為了使用資源),當該整數(shù)值為零時,所有試圖通過它的線程都將處于等待狀態(tài)。在信號量上我們定義兩種操作: Wait(等待) 和 Release(釋放)。 當一個線程調(diào)用Wait(等待)操作時,它要么通過然后將信號量減一,要么一直等下去,直到信號量大于一或超時。Release(釋放)實際上是在信號量上執(zhí)行加操作,對應于車輛離開停車場,該操作之所以叫做“釋放”是因為加操作實際上是釋放了由信號量守護的資源。

    在Java中,還可以設置該信號量是否采用公平模式,如果以公平方式執(zhí)行,則線程將會按到達的順序(FIFO)執(zhí)行,如果是非公平,則可以后請求的有可能排在隊列的頭部。
JDK中定義如下:

        Semaphore(int permits, boolean fair)

     創(chuàng)建具有給定的許可數(shù)和給定的公平設置的Semaphore。

    Semaphore當前在多線程環(huán)境下被擴放使用,操作系統(tǒng)的信號量是個很重要的概念,在進程控制方面都有應用。Java并發(fā)庫Semaphore 可以很輕松完成信號量控制,Semaphore可以控制某個資源可被同時訪問的個數(shù),通過 acquire() 獲取一個許可,如果沒有就等待,而 release() 釋放一個許可。比如在Windows下可以設置共享文件的最大客戶端訪問個數(shù)。

    Semaphore實現(xiàn)的功能就類似廁所有5個坑,假如有10個人要上廁所,那么同時只能有多少個人去上廁所呢?同時只能有5個人能夠占用,當5個人中 的任何一個人讓開后,其中等待的另外5個人中又有一個人可以占用了。另外等待的5個人中可以是隨機獲得優(yōu)先機會,也可以是按照先來后到的順序獲得機會,這取決于構(gòu)造Semaphore對象時傳入的參數(shù)選項。單個信號量的Semaphore對象可以實現(xiàn)互斥鎖的功能,并且可以是由一個線程獲得了“鎖”,再由另一個線程釋放“鎖”,這可應用于死鎖恢復的一些場合。

代碼示例

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Semaphore; 
 
 
/** 
 * DateTime: 2015年1月1日 下午6:41:01 
 * 
 */ 
public class SemaPhore { 
  public static void main(String[] args) { 
    // 線程池 
    ExecutorService exec = Executors.newCachedThreadPool(); 
    // 只能5個線程同時訪問 
    final Semaphore semp = new Semaphore(5); 
    // 模擬20個客戶端訪問 
    for (int index = 0; index < 50; index++) { 
      final int NO = index; 
      Runnable run = new Runnable() { 
        public void run() { 
          try {<span id="transmark"></span> 
            // 獲取許可 
            semp.acquire(); 
            System.out.println("Accessing: " + NO); 
            Thread.sleep((long) (Math.random() * 6000)); 
            // 訪問完后,釋放 
            semp.release(); 
            //availablePermits()指的是當前信號燈庫中有多少個可以被使用 
            System.out.println("-----------------" + semp.availablePermits());  
          } catch (InterruptedException e) { 
            e.printStackTrace(); 
          } 
        } 
      }; 
      exec.execute(run); 
    } 
    // 退出線程池 
    exec.shutdown(); 
  } 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • 使用FeignClient進行微服務交互方式(微服務接口互相調(diào)用)

    使用FeignClient進行微服務交互方式(微服務接口互相調(diào)用)

    這篇文章主要介紹了使用FeignClient進行微服務交互方式(微服務接口互相調(diào)用),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java遞歸算法的實例詳解

    java遞歸算法的實例詳解

    在本篇文章里小編給大家整理了關(guān)于java遞歸算法的實例內(nèi)容,以及相關(guān)知識點總結(jié),需要的朋友們可以學習下。
    2020-02-02
  • Spring Boot企業(yè)常用的starter示例詳解

    Spring Boot企業(yè)常用的starter示例詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot企業(yè)常用starter的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-12-12
  • Spring?Bean是如何初始化的詳解

    Spring?Bean是如何初始化的詳解

    Spring只Bean加載機制默認情況下是初始化容器的時候就會直接初始化,但是也取決于是否使用了懶加載,下面這篇文章主要給大家介紹了關(guān)于Spring?Bean是如何初始化的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Spring?BeanFactory工廠使用教程

    Spring?BeanFactory工廠使用教程

    Spring的本質(zhì)是一個bean工廠(beanFactory)或者說bean容器,它按照我們的要求,生產(chǎn)我們需要的各種各樣的bean,提供給我們使用。只是在生產(chǎn)bean的過程中,需要解決bean之間的依賴問題,才引入了依賴注入(DI)這種技術(shù)
    2023-02-02
  • 利用MyBatis-Plus靈活處理JSON字段的技巧與最佳實踐

    利用MyBatis-Plus靈活處理JSON字段的技巧與最佳實踐

    這篇文章主要給大家介紹了關(guān)于利用MyBatis-Plus靈活處理JSON字段的技巧與最佳實踐,Mybatis-Plus可以很方便地處理JSON字段,在實體類中可以使用@JSONField注解來標記JSON字段,需要的朋友可以參考下
    2024-07-07
  • Spring boot熱部署devtools過程解析

    Spring boot熱部署devtools過程解析

    這篇文章主要介紹了Spring boot熱部署devtools過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Spring高級之注解@PropertySource的原理

    Spring高級之注解@PropertySource的原理

    這篇文章主要介紹了Spring高級之注解@PropertySource的原理,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java創(chuàng)建對象的六種常用方式總結(jié)

    Java創(chuàng)建對象的六種常用方式總結(jié)

    作為Java開發(fā)者,經(jīng)常創(chuàng)建很多對象,你是否知道Java中創(chuàng)建對象有哪些方式呢?下面這篇文章主要給大家介紹了關(guān)于Java創(chuàng)建對象的六種常用方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-06-06
  • Spring?Native打包本地鏡像的操作方法(無需通過Graal的maven插件buildtools)

    Spring?Native打包本地鏡像的操作方法(無需通過Graal的maven插件buildtools)

    這篇文章主要介紹了Spring?Native打包本地鏡像,無需通過Graal的maven插件buildtools,本文探索一下,如果不通過這個插件來生成鏡像,結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-02-02

最新評論

沂南县| 井研县| 宜宾县| 株洲市| 蓝山县| 万载县| 定兴县| 敦煌市| 广汉市| 遂川县| 津南区| 夏邑县| 二连浩特市| 永年县| 凤翔县| 大安市| 浦北县| 都兰县| 本溪市| 蒙阴县| 红安县| 八宿县| 峨山| 广宁县| 阿图什市| 信阳市| 寿光市| 鲁山县| 南岸区| 府谷县| 蕉岭县| 雷波县| 长葛市| 汪清县| 原平市| 新绛县| 扬州市| 肥西县| 大安市| 大竹县| 广德县|