自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

別再和面試官說不懂信號量Semaphore了!

開發(fā) 前端
最常見的就是各種池化資源,比如數(shù)據(jù)庫連接池,同一時刻,允許多個線程同時使用連接池。每個連接在被釋放前,不允許其他線程使用。

[[396936]]

已經(jīng)習慣了阿里面試官的冷笑:用過Semaphore吧,不妨說說?

本質就是 信號量模型,模型圖如下:

其中的 計數(shù)器 和 等待隊列 對外部是透明的,僅能通過提供的三大方法訪問它們。

詳細說說哪三大方法?

  • init()

用于設置計數(shù)器的初始值。

  • down()

計數(shù)器-1。若此時計數(shù)器<0,則當前線程被 阻塞。

  • up()

計數(shù)器+1。若此時計數(shù)器≤0,則喚醒 等待隊列 中的一個線程,并將其從【等待隊列】移除。有同學可能會認為這里的判斷條件應該≥0,估計你是理解成生產(chǎn)者-消費者模式中的生產(chǎn)者了。可以反過來想,>0 意味著沒有阻塞的線程,所以只有 ≤0 時才需要喚醒一個等待的線程。

down()、up()應配對使用,并按序使用:

  1. 先調用down(),獲取鎖
  2. 執(zhí)行處理完后,調用up(),釋放鎖

若信號量init值為1,并發(fā)場景下應該不會出現(xiàn)>0情況,除非故意調先用up(),但這也失去了信號量的意義。

注意,這些方法都是原子性的,由信號量模型的實現(xiàn)方保證。JDK里的信號量模型就是由Semaphore實現(xiàn),Semaphore保證了這三個方法都是原子操作。

  1. talk is cheap,show me code? 

信號量模型中的down()、up()最早被稱為P操作和V操作,信號量模型也稱PV原語。還有的人會用semWait()和semSignal()表達它們,叫法不同,語義都相同。JUC的acquire()、release()分別對應down()和up()。

如何使用信號量?

就像信號燈,必須先檢查是否為綠燈才能通過。比如累加器,count+=1操作是個臨界區(qū),只允許一個線程執(zhí)行,也就是說要保證互斥。 

假設線程t1、t2同時訪問add(),當同時調用acquire時,由于acquire是個原子操作,僅會有一個線程(假設t1)把信號量里的計數(shù)器減為0,t2則是將計數(shù)器減為-1:

  • 對t1,信號量里面的計數(shù)器的值是0,≥0,所以t1不會被阻塞,而是繼續(xù)執(zhí)行
  • 對t2,信號量里面的計數(shù)器的值是-1,<0,所以t2被阻塞

所以此時只有t1會進入臨界區(qū)執(zhí)行count+=1。

當t1執(zhí)行release(),信號量里計數(shù)器的值是-1,加1之后的值是0,≤0,根據(jù)up(),此時等待隊列中的t2會被喚醒。于是t2在t1執(zhí)行完臨界區(qū)代碼后,才獲得進入臨界區(qū)執(zhí)行的機會,這就保證了互斥。

既然有JDK提供了Lock,為啥還要提供一個Semaphore ?

實現(xiàn)互斥鎖,僅是 Semaphore的部分功能,Semaphore還可以允許多個線程訪問一個臨界區(qū)。

最常見的就是各種池化資源,比如數(shù)據(jù)庫連接池,同一時刻,允許多個線程同時使用連接池。每個連接在被釋放前,不允許其他線程使用。

對象池要求一次性創(chuàng)建出N個對象,之后所有的線程重復利用這N個對象,當然對象在被釋放前,也是不允許其他線程使用的。所以核心就是限流器,這里的限流指不允許多于N個線程同時進入臨界區(qū)。

如何快速實現(xiàn)一個這樣的限流器呢?

那就是信號量。把計數(shù)器的值設置成對象池里對象的個數(shù)N即可: 

注意這里使用的是 Vector,進入臨界區(qū)的N個線程不安全。add/remove都是不安全的。比如 ArrayList remove() :

好的,請回家等通知吧!

本文轉載自微信公眾號「JavaEdge」,可以通過以下二維碼關注。轉載本文請聯(lián)系JavaEdge公眾號。

 

責任編輯:武曉燕 來源: JavaEdge
相關推薦

2021-09-07 07:53:42

Semaphore 信號量源碼

2020-04-16 08:22:11

HTTPS加解密協(xié)議

2020-11-10 15:25:26

SemaphoreLinux翻譯

2022-04-13 11:12:43

鴻蒙輕內核信號量模塊操作系統(tǒng)

2020-08-03 07:04:54

測試面試官應用程序

2024-04-10 08:16:20

多線程編程Java并發(fā)編程

2021-05-31 20:30:55

鴻蒙HarmonyOS應用

2022-05-27 21:56:55

索引存儲MySQL 存儲引擎

2021-04-13 09:20:15

鴻蒙HarmonyOS應用開發(fā)

2010-04-21 16:50:31

Unix信號量

2020-11-05 09:59:24

Linux內核信號量

2018-04-27 14:46:07

面試簡歷程序員

2021-08-30 08:03:22

信號量Go

2019-07-10 10:06:24

面試官三次握手四次揮手

2020-02-03 17:22:34

垃圾回收原理種類

2020-03-14 09:17:55

HTTPS網(wǎng)絡協(xié)議HTTP

2010-04-21 16:25:13

Unix信號量

2010-04-21 16:42:48

Unix信號量

2020-06-22 08:16:16

哈希hashCodeequals

2022-07-12 12:05:22

JavaSemaphore
點贊
收藏

51CTO技術棧公眾號