簡體   English   中英

兩個功能可以同時運行,但不能與其他功能同時運行

[英]Two functions can run concurrently but not with other functions

我有十個泛型函數,它們在我的框架中經常運行。 這些函數中有兩個是A類型的,其他八個是B類型的。我希望能夠同時運行A型函數,但不允許在運行A型函數時運行B型函數。 同樣,如果正在運行B型函數,則我不想允許任何A型函數運行。 我也不想運行任何其他類型的B。

除了使用ReentrantReadWriteLock(具有圍繞類型A的讀取鎖和圍繞類型B的寫入鎖)以外,還有什么更好的方法(特別是在Java中)實現此方法?

ReentrantReadWriteLock適用於大多數時候需要讀取器鎖,而“偶爾”需要寫入器鎖的情況。 但是,就我而言,所有功能都始終使用,這意味着所有功能均以相同的頻率調用。 無論我將ReentrantReadWriteLock設置為公平還是不公平,我都發現系統中的鎖存在很多爭用。

ReentrantReadWriteLock適用於大多數時候需要讀取器鎖,而“偶爾”需要寫入器鎖的情況。

我不確定你從哪里得到這個主意。 ReentrantReadWriteLock在許多地方都用於正確處理您概述的情況。 它被設計為具有高性能和(當然)可重入的特性,並且您可能從手動編碼中拼湊的任何解決方案最有可能表現不佳。

但是,就我而言,所有功能都始終使用,這意味着所有功能均以相同的頻率調用。

沒關系 您應該閱讀有關“公平”的ReentrantReadWriteLock javadocs的詳細信息 ,但是A和B的任何頻率都將由鎖很好地處理。

要總結的文檔,在“公平”的模式下,如果A B任務去獲取寫鎖,這將阻止的一組已經等待任務的后面 如果A任務要鎖定,則只有在沒有B任務正在等待時才允許它運行。 “不公平”模式將允許A任務運行,並且如果B任務連續出現,則可能會餓死B任務,但可能“通常比公平鎖定具有更高的吞吐量”。

除非您有其他特殊原因,否則我會堅持“公平”政策。

無論我將ReentrantReadWriteLock設置為公平還是不公平,我都發現系統中的鎖存在很多爭用。

我認為這是可以預料的。 無論采用哪種解決方案,如果您都有以下降頻率執行的A和B任務,您將獲得鎖爭用。 也許如果您編輯了問題並提供了有關為什么您認為該爭用出乎意料的更多詳細信息,我們可以提供更好的答案。

我希望能夠同時運行A型函數,但不允許在運行A型函數時運行B型函數。

因此,A任務將使用ReentrantReadWriteLock讀取部分:

private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private final Lock readLock = readWriteLock.readLock();
private final Lock writeLock = readWriteLock.writeLock();
...
private void functionA() {
    readLock.lock();
    try {
       // do the A processing here ...
    } finally {
       readLock.unlock();
    }
}

如果B型函數正在運行,我不希望任何A型函數被允許運行。 我也不想運行任何其他類型的B。

因此,B任務將使用鎖的寫部分:

private void functionB() {
    writeLock.lock();
    try {
       // do the B processing here ...
    } finally {
       writeLock.unlock();
    }
}

暫無
暫無

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

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