[英]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
調用僅在writeRequests
或writers
大於0
wait
, write Thread
如何才有機會獲取鎖定?
基於上述假設和語句,多個read Threads
如何同時訪問一個方法,因為它們應該首先調用同步的lockRead()
?
編輯:在看到你編輯問題之后,你問的是當多個線程在同一個同步塊中調用wait()
時會發生什么 - 請參閱此內容以獲取有關所謂“釋放監視器”的詳細說明 - http:// www .artima.com / insidejvm / ED2 / threadsynchP.html
為了簡化事情:
synchronized(this)
塊。 synchronized
塊中調用wait()
釋放鎖並將線程切換到WAITING狀態。 在這種情況下其他線程可以使用同一個對象獲取同一對象的鎖,並有可能通知狀態改變其他等待的線程(解鎖方法證明)上(等待this
在我們的情況下,因為你使用synchronized方法) unlockRead()
/ unlockWrite()
) - 這意味着它們可以在進入時阻止互斥,但不運行任何方法阻止代碼(並迅速結束)。 或者,他們正在等待但是非阻塞( lockRead()
/ lockWrite()
) - 就像解鎖方法一樣,他們的執行可能會被阻止,但是他們不會阻止,而是在這種情況下等待。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.