精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊Semaphore 信號量源碼分析

開發 項目管理
Semaphore 信號量, 信號量維護了一組許可。如果有必要每個采集模塊都會阻塞,直到有許可可用。然后獲取許可證。每次發布都會添加一個許可證,可能會釋放一個阻塞資源。

[[422207]]

本文轉載自微信公眾號「運維開發故事」,作者老鄭。轉載本文請聯系運維開發故事公眾號。

概述

Semaphore 信號量, 信號量維護了一組許可。如果有必要每個采集模塊都會阻塞,直到有許可可用。然后獲取許可證。每次發布都會添加一個許可證,可能會釋放一個阻塞資源。但是,沒有使用實際的許可對象;信號量可用數量的計數,并且進行操作。 信號量通常可以用于限制訪問某些(物理或者邏輯)資源的線程數。例如下面是一個使用信號量控制對線程池訪問。

  1. class Pool { 
  2.   private static final int MAX_AVAILABLE = 100; 
  3.   private final Semaphore available = new Semaphore(MAX_AVAILABLE, true); 
  4.  
  5.   public Object getItem() throws InterruptedException { 
  6.     available.acquire(); 
  7.     return getNextAvailableItem(); 
  8.   } 
  9.  
  10.   public void putItem(Object x) { 
  11.     if (markAsUnused(x)) 
  12.       available.release(); 
  13.   } 
  14.  
  15.   // Not a particularly efficient data structure; just for demo 
  16.  
  17.   protected Object[] items = ... whatever kinds of items being managed 
  18.   protected boolean[] used = new boolean[MAX_AVAILABLE]; 
  19.  
  20.   protected synchronized Object getNextAvailableItem() { 
  21.     for (int i = 0; i < MAX_AVAILABLE; ++i) { 
  22.       if (!used[i]) { 
  23.          used[i] = true
  24.          return items[i]; 
  25.       } 
  26.     } 
  27.     return null; // not reached 
  28.   } 
  29.  
  30.   protected synchronized boolean markAsUnused(Object item) { 
  31.     for (int i = 0; i < MAX_AVAILABLE; ++i) { 
  32.       if (item == items[i]) { 
  33.          if (used[i]) { 
  34.            used[i] = false
  35.            return true
  36.          } else 
  37.            return false
  38.       } 
  39.     } 
  40.     return false
  41.   } 

在獲取項目之前,每個線程必須從信號量獲取一個許可證,以確保項目可用。當線程處理完該項后,它將返回到池中,并向信號量返回一個許可證,允許另一個線程獲取該項。請注意,在調用acquire時不會保持同步鎖,因為這會阻止項目返回池。信號量封裝了限制對池的訪問所需的同步,與維護池本身一致性所需的任何同步分開。

初始化為1的信號量,其使用方式是最多只有一個可用的許可證,可以用作互斥鎖。這通常被稱為二進制信號量,因為它只有兩個狀態:一個許可證可用,或者零個許可證可用。以這種方式使用時,二進制信號量的屬性(與許多java.util.concurrent.locks.Lock實現不同)是“鎖”可以由所有者以外的線程釋放(因為信號量沒有所有權的概念)。這在某些特定的上下文中非常有用,例如死鎖恢復。

此類的構造函數可以選擇接受公平性參數。當設置為false時,此類不保證線程獲取許可的順序。特別是,允許bargging,也就是說,調用acquire的線程可以在一直在等待的線程之前分配一個許可證-從邏輯上講,新線程將自己置于等待線程隊列的頭部。當公平性設置為true時,信號量保證選擇調用任何acquire方法的線程,以按照其調用這些方法的處理順序(先進先出;先進先出)。請注意,FIFO排序必然適用于這些方法中的特定內部執行點。因此,一個線程可以在另一個線程之前調用acquire,但在另一個線程之后到達排序點,類似地,從方法返回時也是如此。還請注意,untimed tryAcquire方法不支持公平性設置,但將接受任何可用的許可。

通常,用于控制資源訪問的信號量應該初始化為公平,以確保沒有線程因訪問資源而耗盡。當將信號量用于其他類型的同步控制時,非公平排序的吞吐量優勢往往超過公平性考慮。

此類還提供了方便的方法,可以一次獲取和發布多個許可證。當使用這些方法時,如果沒有將公平設置為真,則要小心無限期延遲的風險增加。

內存一致性影響:在調用“release”方法(如release())之前的線程中的操作發生在另一個線程中成功的“acquire”方法(如acquire()之后的操作)之前。

原理分析

Semaphore 信號量,是控制并發的有效手段。它底層通過 AQS 實現。如下圖所示:

構造方法

Semaphore 構造方法有兩個 Semaphore(int permits) 和 Semaphore(int permits, boolean fair) 后者有兩個參數:第一個參數是許可數量初始化,第二個參數定義信號量是否公平鎖同步(默認為非公平)。

  1. public Semaphore(int permits) { 
  2.     sync = new NonfairSync(permits); 
  3.  
  4.  
  5. public Semaphore(int permits, boolean fair) { 
  6.     sync = fair ? new FairSync(permits) : new NonfairSync(permits); 

acquire 方法

acquire 方法可以為理解獲取許可,如果存在剩余許可那么就可以進入后續代碼塊,如果沒有獲取線程進入阻塞。在共享模式下獲取,如果中斷將中止。通過首先檢查中斷狀態,然后調用至少一次tryAcquireShared,并在成功時返回來實現。否則線程將排隊,可能會重復阻塞和取消阻塞,調用tryAcquireShared,直到成功或線程中斷。

release 方法

acquire 方法可以為理解釋放許可,其他等待許可的線程進入資源競爭階段。然后去查找等待隊列隊頭有效的等待節點進行喚醒。

整體流程

Semaphore 信號量原理.png

舉個例子

場景描述

對于控制流量,或者控制并發我們可以使用 Semaphore 信號量來完成。例子:有100 個人需要過橋,但是橋上最多同時能夠承受 5 個人的重量。如果我們需要有序的過橋那么就可以采用信號量的方式來控制。

初始化 5 個許可。

上橋之前先去獲取 許可,如果有剩余許可就上橋。

如果沒有 許可,就等待許可。

image.png

模擬代碼

首先定義橋對象,入下所示:

  1. public class Bridge { 
  2.  
  3.     private String name
  4.  
  5.     private String address; 
  6.  
  7.     private Integer max
  8.  
  9.     public String getName() { 
  10.         return name
  11.     } 
  12.  
  13.     public void setName(String name) { 
  14.         this.name = name
  15.     } 
  16.  
  17.     public String getAddress() { 
  18.         return address; 
  19.     } 
  20.  
  21.     public void setAddress(String address) { 
  22.         this.address = address; 
  23.     } 
  24.  
  25.     public Integer getMax() { 
  26.         return max
  27.     } 
  28.  
  29.     public void setMax(Integer max) { 
  30.         this.max = max
  31.     } 

然后定義遷徙者對象,就是過橋的人,然后他有個動作就是過橋。代碼如下所示。

  1. public class Migrator { 
  2.  
  3.     private String name
  4.  
  5.     public void gapBridge() { 
  6.         System.out.println("Migrator: " + this.name + ", time:" + System.currentTimeMillis()); 
  7.     } 
  8.  
  9.     public String getName() { 
  10.         return name
  11.     } 
  12.  
  13.     public void setName(String name) { 
  14.         this.name = name
  15.     } 

調用代碼如下:

  1. public class MainTest { 
  2.  
  3.     public static void main(String[] args) { 
  4.         Bridge bridge = new Bridge(); 
  5.         bridge.setAddress("云南"); 
  6.         bridge.setName("XX 橋"); 
  7.         bridge.setMax(5); 
  8.  
  9.         Semaphore semaphore = new Semaphore(bridge.getMax()); 
  10.         for (int i=0; i< 100; i++) { 
  11.             int idx = i; 
  12.             new Thread(()-> { 
  13.                 try { 
  14.                     Migrator migrator = new Migrator(); 
  15.                     migrator.setName("name-" + idx); 
  16.                     semaphore.acquire(); 
  17.                     TimeUnit.SECONDS.sleep(1); 
  18.                     migrator.gapBridge(); 
  19.                     System.out.println("name " + migrator.getName() + " 通過"); 
  20.                 } catch (InterruptedException e) { 
  21.                     e.printStackTrace(); 
  22.                 } finally { 
  23.                     semaphore.release(); 
  24.                 } 
  25.             }).start(); 
  26.         } 
  27.     } 

輸出日志如下:我們可以看到剛開始的時候有 5 個線程獲取到 "許可" 幾乎同時過橋,后面逐漸就是釋放一個許可,另外一個線程繼續執行。

  1. Migrator: name-7, time:1630495912011 
  2. name name-7 通過 
  3. Migrator: name-2, time:1630495912011 
  4. name name-2 通過 
  5. Migrator: name-4, time:1630495912011 
  6. Migrator: name-8, time:1630495912011 
  7. Migrator: name-3, time:1630495912011 
  8. name name-3 通過 
  9. name name-8 通過 
  10. name name-4 通過 
  11. Migrator: name-5, time:1630495913012 
  12. name name-5 通過 
  13. Migrator: name-0, time:1630495913012 
  14. name name-0 通過 
  15. Migrator: name-6, time:1630495913013 

參考文檔

 

https://www.cnblogs.com/leesf456/p/5414778.html

 

責任編輯:武曉燕 來源: 運維開發故事
相關推薦

2022-04-13 11:12:43

鴻蒙輕內核信號量模塊操作系統

2021-05-31 20:30:55

鴻蒙HarmonyOS應用

2020-11-05 09:59:24

Linux內核信號量

2021-04-13 09:20:15

鴻蒙HarmonyOS應用開發

2020-11-10 15:25:26

SemaphoreLinux翻譯

2021-04-30 00:00:50

Semaphore信號量面試官

2024-04-10 08:16:20

多線程編程Java并發編程

2010-04-21 16:50:31

Unix信號量

2025-04-16 08:50:00

信號量隔離線程池隔離并發控制

2010-04-21 16:25:13

Unix信號量

2010-04-21 16:42:48

Unix信號量

2020-09-25 07:34:40

Linux系統編程信號量

2010-04-21 15:37:38

Unix信號量

2023-06-02 08:14:58

信號量對象線程

2024-10-29 15:23:45

Python線程安全

2023-10-06 23:31:25

可視化Go

2019-11-19 09:00:38

JavaAND信號量

2010-03-17 16:36:10

Java信號量模型

2010-04-21 17:10:25

Unix信號量

2010-07-15 15:32:10

Perl線程
點贊
收藏

51CTO技術棧公眾號

成人黄色大片在线免费观看| 亚洲一区二区精品久久av| 日本91av在线播放| 成人免费视频入口| 伊人久久大香线蕉av超碰| 久久久噜噜噜久久人人看| 国产日韩欧美在线视频观看| 日韩在线视频免费看| 麻豆一区在线| 日韩欧美在线视频日韩欧美在线视频| 无码免费一区二区三区免费播放| 国产男人搡女人免费视频| 精品福利一区| 欧美日韩精品免费观看视频| 成人免费视频91| 久久精品色图| 国产精品综合一区二区| 55夜色66夜色国产精品视频| 亚洲人做受高潮| 天堂成人娱乐在线视频免费播放网站 | 欧美成人视屏| 91久色porny| 99久久精品免费看国产四区| 中文字幕乱伦视频| 国产午夜精品一区二区三区欧美| 精品国产一区二区三区四区在线观看 | k8久久久一区二区三区| 91精品视频免费观看| 99久久精品国产亚洲| 欧美91福利在线观看| 亚洲性视频网站| 在线精品一区二区三区| 国产精品1区在线| 色嗨嗨av一区二区三区| 蜜臀av色欲a片无码精品一区| 最近高清中文在线字幕在线观看| 国产原创一区二区三区| 国产精品男女猛烈高潮激情| av大片免费观看| 欧美黄色精品| 久久久国产精品视频| 成都免费高清电影| 天天久久夜夜| 亚洲国产又黄又爽女人高潮的| 99999精品| 亚洲永久精品一区| 日韩视频三区| 欧美激情一二区| 少妇久久久久久被弄高潮| 999久久久精品国产| 伊人久久五月天| 国产jk精品白丝av在线观看 | 欧美日韩精品综合| 头脑特工队2在线播放| 福利一区福利二区| 国产精品嫩草在线观看| 黄色av小说在线观看| 国产成a人亚洲精| 产国精品偷在线| 亚洲第一免费视频| 懂色中文一区二区在线播放| 99在线观看视频网站| 亚洲av无码国产精品永久一区 | 尤物网址在线观看| 中文字幕免费在线观看视频一区| 天天好比中文综合网| 国产爆初菊在线观看免费视频网站| 久久精品一区二区三区av| 欧美一区二区福利| av在线三区| 中文字幕亚洲不卡| 国产一区二区三区在线免费| av手机在线观看| 日韩人体视频一二区| 免费黄色一级网站| 国产精品日本一区二区三区在线 | 婷婷开心激情综合| 91黄色小网站| 日韩一区二区三免费高清在线观看| 欧美久久久久久蜜桃| 人妻av一区二区三区| 欧洲亚洲视频| 最近2019中文字幕一页二页| 青青草原国产视频| 免费在线成人| 成人激情视频免费在线| 精品人妻一区二区三区含羞草| 成人黄色大片在线观看| 欧美日韩综合另类| а√资源新版在线天堂| 亚洲超丰满肉感bbw| 999精品网站| 日韩黄色av| 亚洲欧美激情视频| 91日韩中文字幕| 在线一区欧美| 91久久精品一区| 凸凹人妻人人澡人人添| 国产精品人成在线观看免费| av一区二区三区免费观看| jizz内谢中国亚洲jizz| 91精品免费在线观看| 人妻少妇精品视频一区二区三区| 日韩综合网站| 91av福利视频| 国产黄a三级三级三级| 久久精品夜夜夜夜久久| 无码人妻精品一区二区蜜桃百度| 成人软件在线观看| 日韩免费电影网站| 天堂网av2018| 午夜影院日韩| 国产精品二区三区四区| 日本电影全部在线观看网站视频 | 中文字幕视频免费观看| av中文字幕一区| japanese在线播放| www.国产精品| 亚洲毛片在线免费观看| 欧美精品一级片| 久久 天天综合| 日韩免费电影一区二区| а√天堂8资源中文在线| 337p亚洲精品色噜噜| 国产传媒国产传媒| 一本一本久久| 国产精品三区在线| 97影院秋霞午夜在线观看| 欧美日韩在线三区| 人妻av无码一区二区三区| 亚洲精品视频啊美女在线直播| 91精品一区二区| av在线之家电影网站| 色婷婷亚洲婷婷| 人妻少妇精品视频一区二区三区| 国精品一区二区三区| 亚洲一区二区三区在线免费观看 | 欧美高清在线观看| 国产影视一区二区| 国产精品无码永久免费888| 各处沟厕大尺度偷拍女厕嘘嘘| 136福利精品导航| 欧美乱妇40p| 国产aⅴ爽av久久久久成人| 国产精品久久久一区麻豆最新章节| 亚洲人成无码www久久久| 亚洲欧美成人vr| 57pao国产成人免费| 亚洲aaa在线观看| 精品久久久久久久久久ntr影视| 北京富婆泄欲对白| 亚洲成人在线| 久久国产精品久久| 综合久久2023| 亚洲香蕉成人av网站在线观看| 在线精品免费视| 国产目拍亚洲精品99久久精品| 久久婷婷国产91天堂综合精品| 国产99久久精品一区二区300| 日本精品久久中文字幕佐佐木| 青青青手机在线视频观看| 欧美视频13p| 欧美 日本 国产| 日韩国产精品久久久| 在线亚洲美日韩| 日韩综合一区二区三区| 国外成人在线视频| 青青草在线免费视频| 日韩欧美中文字幕在线观看| 女女互磨互喷水高潮les呻吟| 蜜桃免费网站一区二区三区| 致1999电视剧免费观看策驰影院| 国产人与zoxxxx另类91| 欧美精品电影在线| 日本啊v在线| 欧美美女一区二区三区| 欧美日韩在线观看成人| 99九九99九九九视频精品| 日本va中文字幕| 亚洲精品网址| 精品一区久久久| 国产精品美女午夜爽爽| 欧美精品一二区| 欧美少妇另类| 91精品综合久久久久久| 日韩欧美性视频| 国产清纯美女被跳蛋高潮一区二区久久w| 手机视频在线观看| 亚洲手机视频| 亚洲看片网站| 黄色欧美在线| 成人h视频在线| 超级白嫩亚洲国产第一| 色阁综合伊人av| 日韩在线观看视频网站| 欧美三级电影在线看| 国产性猛交普通话对白| 欧美国产日韩一二三区| 麻豆tv在线观看| 美女国产一区二区三区| 亚洲国产精品成人天堂| 日韩在线不卡| 久久久久久欧美精品色一二三四| 欧美xxxx网站| 91精品国产91久久久久久吃药 | 欧美第一黄色网| 国产一二三区在线视频| 欧美一级在线观看| 日韩中文字幕高清| 亚洲一级二级三级| 国产三级精品三级观看| 91网上在线视频| 特种兵之深入敌后| 麻豆久久久久久| 国产精品50p| 欧美1区2区| 一区二区日本| jizzjizz欧美69巨大| 狠狠色综合一区二区| 国产欧美视频在线| 国产精品永久免费在线| 欧美成人a交片免费看| 久久久久女教师免费一区| 无遮挡动作视频在线观看免费入口| 日韩精品中文字幕在线观看 | 国产精品一区二区黑丝| 成人一区二区三| 亚洲综合99| 青青青免费在线| 亚洲一级网站| 黄色三级中文字幕| 一区二区三区国产精华| 在线日韩av永久免费观看| 日韩久久精品| 亚洲人成77777| 欧美三级伦理在线| 日本一区不卡| 精品国产123区| 奇米视频888战线精品播放| 偷拍一区二区| 免费国产一区二区| 亚洲精品亚洲人成在线观看| 久久本道综合色狠狠五月| 日本午夜精品| 免费av在线一区二区| 啪啪激情综合网| 欧美成ee人免费视频| 一本久久青青| 欧美三级电影在线播放| 蜜桃精品wwwmitaows| 日韩av一级大片| 日韩综合精品| 五月天在线免费视频| 欧美fxxxxxx另类| 日本福利视频网站| 亚洲经典在线| 国产最新免费视频| 久色成人在线| 69久久久久久| 国产一区二区三区综合| 伊人影院在线观看视频| 成人免费观看视频| 亚洲国产第一区| 久久久五月婷婷| 国产主播av在线| 亚洲乱码中文字幕| 国产精品美女毛片真酒店| 欧美日韩亚洲国产一区| 中文字幕在线天堂| 3d动漫精品啪啪一区二区竹菊| av中文在线观看| 日韩电影免费在线观看中文字幕 | 国产精品嫩草影院av蜜臀| 国产成人免费在线观看视频| 亚洲精品免费播放| 日韩手机在线观看| 色欧美乱欧美15图片| 91亚洲国产成人精品一区| 日韩欧美成人一区二区| 天天av综合网| www日韩欧美| 欧美13videosex性极品| 国产成人精品久久久| 国产一区二区三区国产精品| 国产精品永久入口久久久| 欧美日韩水蜜桃| 日韩中文在线字幕| 久久国产成人| 欧美激情第四页| 久久久久久久久久久电影| 精品国产视频在线观看| 黄网动漫久久久| 国产精品久久久久毛片| 亚洲国产精品字幕| 欧美三级黄网| 7777精品视频| 成人51免费| 日本一区二区三区www| 午夜日韩福利| 91蝌蚪视频在线观看| 国产成人免费视频网站高清观看视频| 野花社区视频在线观看| 国产精品久久久久久久久久免费看| 久久中文免费视频| 在线观看欧美日本| 99热这里只有精品9| 亚洲男女性事视频| 美女精品视频| 成人黄色影片在线| 欧美午夜精彩| 成人在线免费在线观看| 国产精品66部| 亚洲欧美卡通动漫| 91国偷自产一区二区开放时间 | 久久免费视频3| 国产精品白丝jk黑袜喷水| 久久久久亚洲AV成人无在| 狠狠躁夜夜躁人人爽天天天天97| www.天堂在线| 久久久91精品国产| 国产成+人+综合+亚洲欧美| 精品一区久久| 99在线|亚洲一区二区| 男人女人拔萝卜视频| 中文字幕在线观看不卡视频| 日韩精品中文字幕在线播放| 亚洲日本香蕉视频| 九九久久综合网站| 青青草国产一区二区三区| 麻豆精品蜜桃一区二区三区| 狠狠综合久久av一区二区老牛| 成人黄色一级大片| 国产精品午夜春色av| 亚洲熟女综合色一区二区三区| 亚洲а∨天堂久久精品喷水| 日本电影在线观看| 92裸体在线视频网站| 欧美国产一级| 色噜噜狠狠一区二区| 国产欧美视频一区二区三区| 五月天激情四射| 国产婷婷色综合av蜜臀av| 不卡视频观看| 精品国产第一页| 中文国产一区| 女人被狂躁c到高潮| 大荫蒂欧美视频另类xxxx| 天天爽夜夜爽夜夜爽| 久久免费福利视频| 精品国产乱子伦一区二区| 奇米影视亚洲色图| 99国产欧美另类久久久精品| 日韩精品人妻中文字幕| 亚洲成人网在线| av免费不卡国产观看| 久久国产精品亚洲va麻豆| 一本色道久久综合| 欧美图片第一页| 在线观看亚洲专区| 一级毛片视频在线| 91精品免费视频| 欧美日本不卡| 欧美熟妇精品一区二区蜜桃视频| 亚洲成人在线网站| 视频国产一区二区三区| 日韩美女毛茸茸| 日韩免费视频| 性生活在线视频| 亚洲国产精品一区二区久久| 天天操天天操天天| 国产成人精品av| 欧美国产小视频| 无码成人精品区在线观看| 欧美日韩在线第一页| wwwxxx在线观看| 91网免费观看| 亚洲欧美网站| 国产高清视频免费在线观看| 日韩欧美一二三区| 忘忧草在线日韩www影院| 亚洲精品不卡| 福利视频网站一区二区三区| 国产精品熟女视频| 欧美xxxx做受欧美.88| 欧美人体视频| 天天干天天操天天做| 亚洲一区二区三区四区不卡| 日产精品久久久久久久性色| 国产日韩欧美成人| 99热在线精品观看| 美女网站视频色| 亚洲国产精品热久久| 日本欧美韩国| 免费拍拍拍网站| 日本一区二区高清| 黄色aaa大片| 成人av资源在线播放| 国产精品久久久久9999高清| 希岛爱理中文字幕| 亚洲免费一级电影|