[英]Threads in Java | wait(), notify() and notifyAll()
我有一個如下接口(假設它是一個 Java 接口和具有 void 返回類型的方法)
interface FileAccessOperations{
fun requestReadAccess()
fun releaseReadAccess()
fun requestWriteAccess()
fun releaseWriteAccess()
}
現在我必須實現這些方法,我需要在大量線程之間管理單個文件的讀/寫權限。
我已經實現如下。
public class FileOperationsImpl implements FileAccessOperations {
/* When count is
* (equals 0) -> File is free, no thread is accessing it (Write and read request is possible)
* (greater than 0) -> File is being read by #count of threads.(Reads are still possible. No write)
* (lesser than 0) -> File is in write mode.(Write/Read is not possible)
*
* So basically, the file can read by multiple threads at a time.
* But only one thread can write at a given time.
*/
private int count = 0;
@Override
synchronized public void requestReadAccess() {
while(count < 0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count++;
}
@Override
synchronized public void releaseReadAccess() {
if(count > 0){
count--;
}
if(count == 0){
notifyAll();
}
}
@Override
synchronized public void requestWriteAccess() {
while(count != 0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count--;
}
@Override
synchronized public void releaseWriteAccess() {
count = 0;
notifyAll();
}
}
我做對了嗎?
我發現您的實施存在幾個問題:
releaseReadAccess
不檢查是否實際持有任何讀訪問,因此可以獲得寫訪問(使count
go 為負)。
releaseWriteAccess
也有類似的問題,它可以將計數增加到 0 以上,創建假讀鎖。
如果在任何鎖存在時調用requestWriteAccess
,它將阻塞直到鎖被釋放,然后什么也不做。
由於這個 function 沒有返回任何值,調用線程永遠不會知道它實際上沒有獲得鎖。
requestReadAccess
的類似問題 - 它會等到它可以授予鎖,但不會增加count
,因此不會授予鎖。
一般來說,最好讓request
函數返回true
或false
以指示天氣鎖已成功獲得,即使它們被阻塞,以防萬一出現一些錯誤情況,這是一個更好的設計實踐。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.