我需要一個不可重入的ReadWriteLock,因爲這個鎖可能會被獲取它的線程釋放。 (我意識到這一點時,我開始拋出:IllegalMonitorStateException間歇。)我可以使用不可重入的ReadWriteLock嗎?
我不知道,如果非重入是正確的術語。 ReentrantLock允許當前持有的線程鎖定以再次獲取它。我不想要這種行爲,因此我稱之爲「不可重入」。
上下文是我有一個使用線程池的套接字服務器。每個連接沒有一個線程。請求可能會被不同的線程處理。客戶端連接可能需要鎖定一個請求並在另一個請求中解鎖。由於請求可能由不同的線程處理,我需要能夠在不同的線程中鎖定和解鎖。
承擔這個問題,我需要留在這個配置和我真的需要鎖定和不同的要求,因此有可能不同的線程解鎖的緣故。
這是一個ReadWriteLock中,因爲我需要讓多個「讀者」或獨有的「作家」。
看起來這可能使用的AbstractQueuedSynchronizer寫,但我怕如果我把它寫我自己,我會讓一些微妙的錯誤。我可以找到使用AbstractQueuedSynchronizer但不是ReadWriteLock的各種示例。
我可以採取在OpenJDK的ReentrantReadWriteLock源,並嘗試刪除折返的一部分,但我又害怕我不會得到它完全正確。
我看着番石榴和Apache共享,但沒有找到合適的東西。 Apache Commons有RWLockManager,它可以做我需要的東西,但我不確定,看起來比我需要的更復雜。
謝謝,這聽起來像它可能會伎倆。閱讀Semaphore的文檔聽起來像我需要指定「公平」選項。 「此課程還提供了便捷的方法來一次獲得和發佈多個許可證。當這些方法被公平使用時,無限期推遲的風險會增加。」 –
我看到Semaphore實現了(至少在OpenJDK中)AbstractQueuedSynchronizer –
太棒了!我發現自己身處同一條船(需要一個多線程/共用節儉服務器後面的r/w鎖)。這個問題和答案正是我需要的!謝謝! – akagixxer