天天看點

java 互斥量_什麼是Java中的互斥和信号量?主要差別是什麼?

問題

什麼是Java中的互斥和信号量?主要差別是什麼?

#1 熱門回答(127 贊)

不幸的是,每個人都錯過了信号量和互斥量之間最重要的差別; "所有權"的概念。

信号量沒有所有權的概念,這意味着任何線程都可以釋放信号量(這可能會導緻許多問題,但可以幫助"死亡檢測")。而互斥鎖确實具有所有權的概念(即,你隻能釋放已獲得的互斥鎖)。

對于并發系統的安全程式設計,所有權非常重要。我總是建議使用互斥量優先于信号量(但有性能影響)。

互斥體還可以支援優先級繼承(可以幫助解決優先級倒置問題)和遞歸(消除一種類型的死鎖)。

還應該指出,存在"二進制"信号量和"計數/一般"信号量。 Java的信号量是計數信号量,是以允許使用大于1的值初始化它(而如指出的那樣,互斥量隻能是概念計數為1)。其他職位也指出了這方面的用處。

總而言之,除非你有多個資源需要管理,否則我總是會推薦信号量超過信号量。

#2 熱門回答(110 贊)

可以計算信号量,而互斥量隻能計為1。

假設你有一個運作的線程接受用戶端連接配接。該線程可以同時處理10個用戶端。然後每個新用戶端設定信号量直到它達到10.當信号量有10個标志,那麼你的線程将不接受新的連接配接

互斥通常用于保護東西。假設你的10個用戶端可以通路系統的多個部分。然後,你可以使用互斥鎖保護系統的一部分,是以當1個用戶端連接配接到該子系統時,沒有其他人可以通路。你也可以使用信号量來實作此目的。互斥鎖是a"Mutual Exclusion Semaphore"。

#3 熱門回答(37 贊)

互斥基本上是互斥的。隻有一個線程可以一次擷取資源。當一個線程擷取資源時,在擁有資源的線程釋放之前,不允許其他線程擷取資源。等待擷取資源的所有線程都将被阻止。

信号量用于控制執行的線程數。将有固定的資源集。每當線程擁有相同的資源時,資源計數就會減少。當信号量計數達到0時,則不允許其他線程擷取資源。線程被阻塞,直到其他線程擁有資源釋放。

簡而言之,主要差別在于允許多個線程一次擷取資源?

Mutex - 一個。

信号量 - 它的DEFINED_COUNT,(與信号量一樣多)