2012-01-30 49 views
17

我已經在Java中使用了​​關鍵字和重入鎖,但我不明白它們有何不同,或者對於給定情況適合。同步和重入鎖之間的區別?

如何決定何時應使用​​以及何時使用重入鎖?

回答

0

我一直認爲同步是「最小阻力的破解」。它只是起作用,大多數人都知道它是如何工作的,但它有一些弱點,可能會影響你的設計,併發性很強。不僅如此,任何客戶端都可以直接訪問對象的同步鎖定,這意味着如果他們抓住並保持其他客戶端無法訪問的鎖定。換句話說,通過默認同步實現的鎖定有效地「發佈」了對象的內部鎖定機制。育。它就像設置自己造成的拒絕服務一樣。

如果你讓你的類內部的重入鎖(或者不使用synchronized,但是在你想要同步的任何地方在你的構造函數中新建的某個內部對象上進行同步),你可以移除這一邊 - 發佈你的內部鎖定機制的作用,增加你必須記住隨着你的課程的發展應用這個內部同步的複雜性。

+0

只有當您將「synchronized」修飾符應用於可訪問的方法時,「任何客戶端纔能有效地直接訪問您的對象的同步鎖定」,而不是在無法訪問的鎖定對象上使用「synchronized」塊。 – Raedwald 2012-01-31 01:30:04

+0

是的。這就是我所說的。如果在方法中使用默認的同步關鍵字,則可以有效地發佈您的鎖。爲了解決這個問題,使內部同步塊。 – 2012-01-31 03:49:06

21

一個ReentrantLock是:

可重入的互斥鎖使用相同的基本行爲和語義 的隱式監視器鎖使用synchronized 方法和語句訪問,但功能更強大。

擴展功能包括:

  1. 讓每個顯示器多於一個condition variable的能力。使用synchronized關鍵字的監視器只能有一個。這意味着重入鎖支持多個wait()/ notify()隊列。
  2. 制鎖的能力fair。同步塊是不公平的。

    「[公平]鎖定支持授予對最長等待線程的訪問權限,否則此鎖定不保證任何特定的訪問順序。

  3. 檢查鎖是否被鎖定的能力。
  4. 獲取等待鎖定的線程列表的能力。

折返鎖的缺點是:

  1. 需要添加import語句。
  2. 需要在try/finally塊中封裝鎖定採集。這使得它比synchronized關鍵字更難看。
  3. ​​關鍵字可以放在方法定義中,避免需要減少嵌套的塊。

摘要

的​​關鍵字是語法上更好,但可重入鎖具有更多的功能。

0

本網站明確提到了ReentrantLock和Java中的synchronized關鍵字之間的區別。我只是從那裏複製和粘貼。

http://javarevisited.blogspot.in/2013/03/reentrantlock-example-in-java-synchronized-difference-vs-lock.html

1)的ReentrantLock和synchronized關鍵字之間的另一個差異顯著是公平性。同步關鍵字不支持公平。任何線程一旦釋放就可以獲取鎖定,但不能指定偏好,另一方面,通過指定公平屬性可以使ReentrantLock公平,同時創建ReentrantLock的實例。公平屬性爲爭用時提供了最長等待線程的鎖定。

2)synchronized和Reentrant鎖之間的第二個區別是tryLock()方法。 ReentrantLock提供了方便的tryLock()方法,該方法只有在其他線程可用或不可用時才獲取鎖定。這減少了在Java應用程序中等待鎖定的線程阻塞。

3)Java中ReentrantLock和synchronized關鍵字之間的區別還有一點,就是能夠在等待Lock時中斷Thread。在同步關鍵字的情況下,一個線程可以被阻塞等待鎖定,無限期的時間,並且沒有辦法控制它。 ReentrantLock提供了一個名爲lockInterruptibly()的方法,它可以用來在線程等待鎖定時中斷它。類似地,如果在特定時間段內鎖定不可用,則可以使用帶有超時的tryLock()超時。

4)ReentrantLock還提供了方便的方法來獲取所有線程等待鎖的列表。