簡體   English   中英

混淆了自定義讀寫鎖實現

[英]Confused with custom read write lock implementation

我在使用wait/notify java看到了一些關於自定義read-write lock實現的帖子。 看起來像:

 public class ReadWriteLock{

  private int readers;
  private int writers;
  private int writeRequests;

  public synchronized void lockRead() throws InterruptedException{
    while(writers > 0 || writeRequests > 0){
      wait();
    }
    readers++;
  }

  public synchronized void unlockRead(){
    readers--;
    notifyAll();
  }

  public synchronized void lockWrite() throws InterruptedException{
    writeRequests++;

    while(readers > 0 || writers > 0){
      wait();
    }
    writeRequests--;
    writers++;
  }

  public synchronized void unlockWrite() throws InterruptedException{
    writers--;
    notifyAll();
  }
}

我無法理解它是如何正常工作的,除非我沒有正確理解wait/notify是如何工作的。 假設read請求和Threads更多,我的問題是:

  • 如果read Threads重復獲取實例上的鎖定,則write Thread如何增加變量writeRequests ,因為它只能在synchronized方法中增加。 因此, Thread應首先獲取鎖定(如果我沒有記錯的話)。 只要read Thread調用僅在writeRequestswriters大於0 waitwrite Thread如何才有機會獲取鎖定?

  • 基於上述假設和語句,多個read Threads如何同時訪問一個方法,因為它們應該首先調用同步的lockRead()

編輯:在看到你編輯問題之后,你問的是當多個線程在同一個同步塊中調用wait()時會發生什么 - 請參閱此內容以獲取有關所謂“釋放監視器”的詳細說明 - http:// www .artima.com / insidejvm / ED2 / threadsynchP.html

為了簡化事情:

  • 同步方法類似於synchronized(this)塊。
  • synchronized塊中調用wait()釋放鎖並將線程切換到WAITING狀態。 在這種情況下其他線程可以使用同一個對象獲取同一對象的鎖,並有可能通知狀態改變其他等待的線程(解鎖方法證明)上(等待this在我們的情況下,因為你使用synchronized方法)
  • 如果您根據該原則映射調用每個方法的可能方案,您可以看到方法是非等待的( unlockRead() / unlockWrite() ) - 這意味着它們可以在進入時阻止互斥,但不運行任何方法阻止代碼(並迅速結束)。 或者,他們正在等待但是非阻塞( lockRead() / lockWrite() ) - 就像解鎖方法一樣,他們的執行可能會被阻止,但是他們不會阻止,而是在這種情況下等待。
  • 因此,無論如何,您可以將您的代碼視為非阻塞,因此它不會造成任何實際問題(至少沒有我能看到的)。
  • 也就是說,你應該防止解鎖不存在的鎖,這會導致一個不希望的行為,其中計數器將低於0(這反過來會影響鎖定方法)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM