成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Semaphore自白:限流器用我就對(duì)了!

開(kāi)發(fā) 后端
Java 中的一個(gè)同步器,與 CountDownLatch 和 CyclicBarrier 不同,Semaphore 是用來(lái)管理許可證的,線程在調(diào)用 acquire() 方法時(shí),如果沒(méi)有許可證,那么線程就會(huì)阻塞等待,直到有許可證時(shí)才能繼續(xù)執(zhí)行。

[[394557]]

大家好,我是 Semaphore,我的中文名字叫“信號(hào)量”,我來(lái)自 JUC 家族(java.util.concurrent)。

我們家族有很多優(yōu)秀的成員,比如:CountDownLatch:等待其他線程都執(zhí)行完再執(zhí)行某線程,CyclicBarrier:循環(huán)阻塞一組線程,直到某個(gè)事件達(dá)成,當(dāng)然我也不比他們?nèi)跖? 罒ω罒。

以下是我的個(gè)人簡(jiǎn)歷,希望各位讀者老爺們給個(gè)好評(píng)和三連,先在此謝過(guò)了~

基本信息

  • 姓名:Semaphore
  • 中文名:(計(jì)數(shù))信號(hào)量
  • 出生日期:JDK 1.5
  • 籍貫:JUC(java.util.concurrent)
  • 用途:Java 中的一個(gè)同步器,與 CountDownLatch 和 CyclicBarrier 不同,Semaphore 是用來(lái)管理許可證的,線程在調(diào)用 acquire() 方法時(shí),如果沒(méi)有許可證,那么線程就會(huì)阻塞等待,直到有許可證時(shí)才能繼續(xù)執(zhí)行。許可證使用 release() 方法來(lái)發(fā)布(發(fā)布一個(gè)許可證),調(diào)用 acquire() 方法時(shí),如果有證書(shū)會(huì)減少許可證并繼續(xù)執(zhí)行后面的代碼,如果沒(méi)有證書(shū)只能阻塞等待許可證,而 Semaphore 在創(chuàng)建時(shí)會(huì)聲明許可證的最大數(shù)量。

專(zhuān)業(yè)技能

我的專(zhuān)業(yè)技能就是“管理證書(shū)”,使用此技能可以輕松的實(shí)現(xiàn)「限流」功能。

什么是限流?

比如五一小長(zhǎng)假快到了,到那時(shí)會(huì)有大量的人去各個(gè)景區(qū)游玩,但是每個(gè)景區(qū)能容納的人是有限的,比如大西安的大唐芙蓉園,它的日承載量是 6 萬(wàn)人次,也就是說(shuō)每天最多能讓 6 萬(wàn)來(lái)這里游玩,但五一的時(shí)候會(huì)來(lái)很多的人,比如突然來(lái)了 10 萬(wàn)人,那這個(gè)時(shí)候就只能「限流」排隊(duì)等待入園了。

也就說(shuō),大唐芙蓉園會(huì)讓 6 萬(wàn)人先進(jìn)去玩,剩余的人在門(mén)口等待排隊(duì),當(dāng)有人從里面出來(lái)的時(shí)候,才允許另一個(gè)排隊(duì)的人進(jìn)去。工作人員會(huì)把人數(shù)始終控制在 6 萬(wàn)人以下,這樣做的目的是為了讓游玩的人有一個(gè)好的體驗(yàn),不至于造成一些意外事故,比如踩踏事件什么的,一定程度上保證了社會(huì)的穩(wěn)定,也便于景區(qū)良好的口碑建立和日后的正常運(yùn)營(yíng),而這種排隊(duì)限制最大人數(shù)的行為就是「限流」。

再來(lái)舉個(gè)例子,比如以車(chē)輛的限號(hào)來(lái)說(shuō),它也是限流的一種常見(jiàn)場(chǎng)景。這樣做的好處,一方面是可以保護(hù)環(huán)境盡可能少一些碳排放,另一方面能有效的緩解上、下班高峰時(shí)段的擁堵情況。尤其是在大西安,很難想象如果不限號(hào),那么會(huì)堵成什么樣?(PS:讓原本本不富裕的生活更是雪上加霜...)

咱們?cè)購(gòu)纳钪械氖吕氐匠绦虍?dāng)中,假設(shè)一個(gè)程序只能為 10W 人提供服務(wù),突然有一天因?yàn)槟硞€(gè)熱點(diǎn)事件,造成了系統(tǒng)短時(shí)間內(nèi)的訪問(wèn)量迅速增加到了 50W,那么導(dǎo)致的直接結(jié)果是系統(tǒng)崩潰,任何人都不能用系統(tǒng)了,顯然只有少人數(shù)能用遠(yuǎn)比所有人都不能用更符合我們的預(yù)期,因此這個(gè)時(shí)候我們要使用「限流」了。

使用Semaphore實(shí)現(xiàn)限流

Semaphore 在創(chuàng)建的時(shí)候可以設(shè)置證書(shū)的數(shù)量,相當(dāng)于設(shè)置了限流的最大值,再通過(guò) release() 方法來(lái)發(fā)放證書(shū),通過(guò) acquire() 方法來(lái)阻塞并等待證書(shū),這樣就通過(guò)控制證書(shū)的方式來(lái)實(shí)現(xiàn)限流功能了。

項(xiàng)目經(jīng)驗(yàn)

接下來(lái),咱們使用代碼的方式來(lái)演示 Semaphore 的使用。我們以停車(chē)場(chǎng)的限流為例,假設(shè)整個(gè)停車(chē)場(chǎng)只有 2 個(gè)車(chē)位(車(chē)位雖少,但足矣說(shuō)明問(wèn)題),但來(lái)停車(chē)的卻有 5 輛車(chē),顯然車(chē)位不夠用了,此時(shí)需要保證停車(chē)場(chǎng)最多只能有 2 輛車(chē),接下來(lái)咱們使用 Semaphore 來(lái)實(shí)現(xiàn)車(chē)輛的限流功能,具體實(shí)現(xiàn)代碼如下:

  1. import java.util.Date
  2. import java.util.concurrent.ExecutorService; 
  3. import java.util.concurrent.Executors; 
  4. import java.util.concurrent.Semaphore; 
  5.  
  6. /** 
  7.  * Author:磊哥 
  8.  * By:Java中文社群 
  9.  */ 
  10. public class SemaphoreExample { 
  11.     // 創(chuàng)建信號(hào)量 
  12.     static Semaphore semaphore = new Semaphore(2); 
  13.  
  14.     public static void main(String[] args) { 
  15.  
  16.         // 創(chuàng)建 5 個(gè)固定的線程數(shù) 
  17.         ExecutorService threadPool = Executors.newFixedThreadPool(5); 
  18.  
  19.         // 定義執(zhí)行任務(wù) 
  20.         Runnable runnable = new Runnable() { 
  21.             @Override 
  22.             public void run() { 
  23.                 // 拿到當(dāng)前線程的名稱(chēng) 
  24.                 String tname = Thread.currentThread().getName(); 
  25.                 System.out.println(String.format("老司機(jī):%s,停車(chē)場(chǎng)外排隊(duì),時(shí)間:%s"
  26.                         tname, new Date())); 
  27.                 try { 
  28.                     // 執(zhí)行此行,讓所有線程先排隊(duì)等待進(jìn)入停車(chē)場(chǎng) 
  29.                     Thread.sleep(100); 
  30.                     // 執(zhí)行阻塞 
  31.                     semaphore.acquire(); 
  32.                     System.out.println(String.format("老司機(jī):%s,已進(jìn)入停車(chē)場(chǎng),時(shí)間:%s"
  33.                             tname, new Date())); 
  34.                     Thread.sleep(1000); 
  35.                     System.out.println(String.format("老司機(jī):%s,離開(kāi)停車(chē)場(chǎng),時(shí)間:%s"
  36.                             tname, new Date())); 
  37.                     // 釋放鎖 
  38.                     semaphore.release(); 
  39.                 } catch (InterruptedException e) { 
  40.                     e.printStackTrace(); 
  41.                 } 
  42.             } 
  43.         }; 
  44.  
  45.         // 執(zhí)行任務(wù) 1 
  46.         threadPool.submit(runnable); 
  47.  
  48.         // 執(zhí)行任務(wù) 2 
  49.         threadPool.submit(runnable); 
  50.  
  51.         // 執(zhí)行任務(wù) 3 
  52.         threadPool.submit(runnable); 
  53.  
  54.         // 執(zhí)行任務(wù) 4 
  55.         threadPool.submit(runnable); 
  56.  
  57.         // 執(zhí)行任務(wù) 5 
  58.         threadPool.submit(runnable); 
  59.  
  60.         // 等線程池任務(wù)執(zhí)行完之后關(guān)閉 
  61.         threadPool.shutdown(); 
  62.     } 

以上代碼的執(zhí)行結(jié)果如下:

從上述的結(jié)果我們可以看出,當(dāng)有 5 輛車(chē)同時(shí)需要進(jìn)入停車(chē)場(chǎng)時(shí),因?yàn)橥\?chē)場(chǎng)的停車(chē)位只有 2 個(gè),所以停車(chē)場(chǎng)最多只能容納 2 輛車(chē)。此時(shí)我們通過(guò) Semaphore 的 acquire 方法(阻塞等待)和 release 方法(頒發(fā)一個(gè)證書(shū))順利的實(shí)現(xiàn)了限流的功能,讓停車(chē)場(chǎng)的車(chē)輛數(shù)始終控制在 2 輛車(chē)以下(等于或小于 2 輛車(chē))。

個(gè)人評(píng)價(jià)

我(Semaphore)實(shí)現(xiàn)證書(shū)控制手段有兩種,一種公平模式和非公平模式,當(dāng)然為了執(zhí)行的性能考慮,默認(rèn)情況下我采取的是非公平的方式,具體實(shí)現(xiàn)可見(jiàn)源碼:

  1. public Semaphore(int permits) { 
  2.     sync = new NonfairSync(permits); // 非公平模式 

關(guān)于公平模式和非公平模式

所謂的公平模式就是以調(diào)用 acquire() 的先后順序來(lái)決定獲取許可證的順序的,公平模式遵循先進(jìn)先出(FIFO)原則;而非公平模式是搶占式的,也就是有可能一個(gè)新的獲取線程恰好在一個(gè)許可證釋放時(shí)得到了這個(gè)許可證,而前面還有等待的線程。

顯然使用非公平的模式性能更高,因?yàn)樗鼤?huì)把許可證發(fā)放給剛好準(zhǔn)備好的線程,而不用再根據(jù)先后順序去“叫號(hào)”了。

使用公平模式

當(dāng)然,你可以手動(dòng)選擇使用公平模式來(lái)運(yùn)行 Semaphore,Semaphore 提供了兩個(gè)構(gòu)造函數(shù),源碼如下:

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

如果想用公平模式就可以使用第二個(gè)構(gòu)造函數(shù) Semaphore(int permits, boolean fair),將 fair 值設(shè)置為 true 就是公平模式來(lái)獲取證書(shū)了。

其他補(bǔ)充

我還提供了一些其他方法,用于實(shí)現(xiàn)更多的功能,詳情如下:

  • int availablePermits():返回此信號(hào)量中當(dāng)前可用的許可證數(shù)。
  • int getQueueLength():返回正在等待獲取許可證的線程數(shù)。
  • boolean hasQueuedThreads():是否有線程正在等待獲取許可證。
  • boolean isFair():查詢(xún) Semaphore 使用的是公平模式還是非公平模式,如果此信號(hào)量使用的是公平模式則返回 true。
  • void release(int permits):釋放給定數(shù)量的許可證,將其返回到信號(hào)量。
  • tryAcquire():從這個(gè)信號(hào)量獲得許可證,只有在調(diào)用時(shí)可以使用該許可證。
  • tryAcquire(int permits):從這個(gè)信號(hào)量獲取給定數(shù)量的許可證,只有在調(diào)用時(shí)全部可用。
  • tryAcquire(int permits, long timeout, TimeUnit unit):從該信號(hào)量獲取給定數(shù)量的許可證,如果在給定的等待時(shí)間內(nèi)全部可用,并且當(dāng)前線程尚未 interrupted。
  • tryAcquire(long timeout, TimeUnit unit):如果在給定的等待時(shí)間內(nèi)可用,并且當(dāng)前線程尚未 到達(dá) interrupted,則從該信號(hào)量獲取許可。
  • void reducePermits(int reduction) :減少可用的許可證數(shù)量 reduction 個(gè),它是 protected 方法。
  • Collection getQueuedThreads() :返回所有等待獲取許可證的線程集合,它是 protected 方法。

總結(jié)

 

Semaphore 信號(hào)量是用來(lái)管理一組證書(shū)的,默認(rèn)情況下它采取的是非公平的方式來(lái)管理證書(shū),這樣做的目的是為了實(shí)現(xiàn)高性能。Semaphore 中包含了兩個(gè)重要的方法:release() 方法發(fā)布一個(gè)許可證書(shū);acquire() 方法阻塞并等待一個(gè)證書(shū)。當(dāng)線程調(diào)用了 acquire() 方法只有擁有了證書(shū)才能繼續(xù)執(zhí)行,因此可以使用 Semaphore 來(lái)實(shí)現(xiàn)限流。

 

責(zé)任編輯:武曉燕 來(lái)源: Java中文社群
相關(guān)推薦

2019-10-08 10:37:46

設(shè)計(jì)技術(shù)程序員

2024-06-20 12:30:34

2023-06-27 06:58:38

機(jī)械鍵盤(pán)軸體

2019-03-21 12:42:18

華為云

2023-07-13 09:05:57

react hook類(lèi)型types

2018-10-12 09:42:00

分布式鎖 Java多線

2019-08-13 15:36:57

限流算法令牌桶

2020-06-08 11:28:22

場(chǎng)景索引設(shè)計(jì)

2024-04-22 00:00:00

配置鏈接穩(wěn)定性

2024-06-26 11:55:44

2017-12-05 15:26:19

2017-12-05 13:12:35

Android軟鍵盤(pán)參數(shù)

2023-12-18 09:53:27

系統(tǒng)管理

2019-08-12 10:27:34

前端程序員網(wǎng)絡(luò)

2013-10-31 15:52:11

2021-09-18 11:28:29

GitHub代碼開(kāi)發(fā)者

2021-12-29 21:31:23

Windows 11Windows微軟

2012-06-08 03:24:38

程序員

2023-05-10 13:58:13

服務(wù)限流系統(tǒng)

2021-10-21 06:39:41

限流熔斷系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美日韩国产一区二区三区 | 亚洲欧美日韩在线一区二区 | 欧美日韩国产在线观看 | 一区二区三区精品视频 | 久久精品在线 | 色婷婷亚洲国产女人的天堂 | 国产精品美女久久久av超清 | 夜夜夜操| 国产欧美精品区一区二区三区 | 国产精品一二区 | 午夜免费在线观看 | 国产在视频一区二区三区吞精 | 麻豆久久久9性大片 | 欧美成人自拍 | 91在线看视频 | 激情福利视频 | 91在线观看免费视频 | 日本在线网站 | 91av在线不卡 | 精品粉嫩aⅴ一区二区三区四区 | 欧美寡妇偷汉性猛交 | 国产在线中文字幕 | 最近免费日本视频在线 | 日韩高清一区 | 亚洲一区二区三区在线播放 | 综合一区二区三区 | 中文天堂在线一区 | 久久久久久久久久久久91 | 亚洲精品1 | 欧美一区二区久久 | 一区二区免费在线观看 | 久久久久久精 | 久久久久国产精品午夜一区 | 国产乱码高清区二区三区在线 | 欧美亚洲激情 | 国产午夜精品久久久久 | 一级全黄少妇性色生活免费看 | 欧美一级片在线观看 | 99精品视频免费观看 | 亚洲欧美另类在线 | 久久久亚洲一区 |