簡體   English   中英

Java 中的線程 | 等待(),通知()和通知所有()

[英]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();
    }
}

我做對了嗎?

我發現您的實施存在幾個問題:

  1. releaseReadAccess不檢查是否實際持有任何讀訪問,因此可以獲得寫訪問(使count go 為負)。

  2. releaseWriteAccess也有類似的問題,它可以將計數增加到 0 以上,創建假讀鎖。

  3. 如果在任何鎖存在時調用requestWriteAccess ,它將阻塞直到鎖被釋放,然后什么也不做。
    由於這個 function 沒有返回任何值,調用線程永遠不會知道它實際上沒有獲得鎖。

  4. requestReadAccess的類似問題 - 它會等到它可以授予鎖,但不會增加count ,因此不會授予鎖。

一般來說,最好讓request函數返回truefalse以指示天氣鎖已成功獲得,即使它們被阻塞,以防萬一出現一些錯誤情況,這是一個更好的設計實踐。

暫無
暫無

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

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