2013-11-01 63 views
4

我在Java的MultiThreading概念上很窮。ReentrantLock使用案例

我正在通過ReentrantLock的功能和用法。 我知道它更靈活,然後同步並添加了更多功能。

我可以看到它上面提到的例子,我把它弄好了。

我無法弄清楚真正的時間場景,它對商業有什麼幫助。

我可以看到,最好避免死鎖。

有人可以提供沒有ReentrantLock的用例將很難解決這種用例。

或者可以指向一些鏈接將會有所幫助。

+0

我正在問現實生活中的用例(場景),它必須使用這種鎖定,並且同步將無助於這種情況。我知道ReentrantLock的功能。 – Jayesh

回答

2

對於一個簡單的情況,如何爲需要性能的應用程序定時鎖定或部分鎖定。

一個非常常見的例子是在線門戶,它讓你購買/預訂門票(任何)。您對您感興趣的座位/資源獲取定時鎖。在時間到期後,如果事務未完成,則任何其他客戶端應用程序(線程)都可以獲取鎖定。

+0

不錯,只是因爲好奇心我問的是紅色的巴士/ bookmyshow還是以這種方式爲座位發生任何預訂? – Jayesh

+0

我不會說他們的代碼庫是用Java編寫的,他們使用ReentrantLock進行同步,但機制很相似。 –

+0

[ReentrantLock](https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html)中沒有任何方法可以讓我鎖定一段時間我有選擇在有限的時間內嘗試鎖定,那麼ReentrantLock如何提供時間鎖定用例?我誤解了任何東西嗎? –

4

ReentrantLock可用於超時要求。假設您正在嘗試獲取鎖定,但鎖定已經在該時間點被使用,您可以使用tryLock(),這將立即返回,稍後您可以再次嘗試。

ReentrantLock有被它的配置結構提供fairLock或不公平的一些其他優勢:

public ReentrantLock(boolean fair) 

如果你把fairfalse比它不會爲您提供公平訂購鎖。並且不公平訂購出現公平鎖定。如果你需要更多的細節,我可以解釋一下。

ReentrantLock的問題是,它很難調試,因爲在日誌中它無法解釋有關鎖的所有者,但在同步它是可能的。這是最大的缺點。

您可以使用此鎖定機制實現像就餐哲學家之類的功能。如果兩根棍子都可用,則繼續進食,然後吃掉其中的一根即可。

public void run() { 
    while (!Thread.currentThread().isInterrupted()) { 
     if (l.getLeftLock().tryLock()) { 
      try { 
       if (r.getRightLock().tryLock()) { 
        try { 
         System.out.println("Eating philosopher1 !!!!"); 
        } finally { 
         r.getRightLock().unlock(); 
        } 
       } 
      } finally { 
       l.getLeftLock().unlock(); 
      } 

     } 
     try { 
      Thread.currentThread().sleep((int) (100 * Math.random())); 
     } catch (InterruptedException ex) { 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 
+0

你告訴我的是ReentrantLock的功能,我在實際生活中(場景)要求用例,它必須使用這種鎖定,並且同步將無助於這種情況。 – Jayesh

+0

@Jayesh我認爲這是非常明顯的答案。我會給你一個很好的例子,你可以通過這個鎖定機制實現像哲學家一樣的功能。如果兩根棍子都可用,請繼續,然後吃掉其中的一根。你明白了? – Trying

1

對於ReentrantLock類,而在我看來平淡​​的主要優點是:在不同的塊

  • 採樣/解除鎖定。
  • 具有公平鎖(FIFO用於等待的線程)
  • 可以嘗試鎖定
  • 可以有多個條件變量

而且,有點離題,但對理解Java併發類,我發現Java Concurrent Animated非常有用。下載可運行jar文件並查看你的自我。