簡體   English   中英

Java阻塞隊列實現問題

[英]Java Blocking Queue Implementation Questions

常見的實現在這里 ,Java的內置實現在這里 關於這兩個實現,我有兩個問題:

1)第一個實現在put()和take()方法上使用了synchronized關鍵字,這意味着只有一個線程可以訪問一個方法。 假設如果線程A調用put()並發現隊列已滿,因此正在等待,則由於鎖尚未釋放,因此沒有人可以調用take()方法,該實現如何使用?

2)Java的內置函數使用兩個鎖:takeLock和putLock,分別用於put()和take()。 我看到間隔隊列是一個鏈表,它不是線程安全的,怎么辦?

正如一些評論中已經提到的那樣,第一個實現僅使用傳統的wait()/ notify()機制,其中一個線程等待(當然釋放鎖)供其他線程通知。

第二個使用不同的鎖進行放置和取出操作。 因此,各個操作(同時put()或take())是同步的。 但是當隊列已滿或為空時,它們需要彼此通信。 因此,它們通過condition彼此交互。 簽出兩種私人方法-

    /**
     * Signals a waiting take. Called only from put/offer (which do not
     * otherwise ordinarily lock takeLock.)
     */
    private void signalNotEmpty() {
        final ReentrantLock takeLock = this.takeLock;
        takeLock.lock();
        try {
            notEmpty.signal();
        } finally {
            takeLock.unlock();
        }
    }

    /**
     * Signals a waiting put. Called only from take/poll.
     */
    private void signalNotFull() {
        final ReentrantLock putLock = this.putLock;
        putLock.lock();
        try {
            notFull.signal();
        } finally {
            putLock.unlock();
        }
    }

put方法向嘗試從空隊列中進行/輪詢的其他線程發出信號,而take方法向試圖將元素放入完整隊列的其他線程發出信號。

暫無
暫無

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

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