簡體   English   中英

Java中是否存在基於生成的密鑰的線程之間相互排斥的通用解決方案?

[英]Is there a generic solution in Java for mutual exclusion between threads based on a generated key?

可以說我有一個FooClass ,其id為long類型:

public class FooClass {
    long id;
}

任何類中都有一個具有相似簽名的方法:

public void shouldBeSynchronizedForAFooClassId(long fooClassId) {
    //does something
}

我能做什么:

  • 我可以使該方法同步,但它是一種不必要的瓶頸,由於FooClassid 1和FooClassid 2可以毫無問題平行地延伸。
  • 我可以生成一個帶有id的字符串並對其進行intern(),並且可以對此進行同步(我不喜歡這個想法)
  • 在Longs上同步也不是一個好主意。
  • 我可以創建一個ID為鍵,被監視Object為值的Map 在這種情況下,我必須使用相同的受監視對象注冊線程數,以便一旦不再有任何線程使用被監視對象,便能夠清除它們。

我認為,必須有一個現成的解決方案,例如:

  • 可能有一個LockManager或其他任何類型生成的類型(在我的秋天,上面是Long)。 它可以提供runSafely(Runnable run)方法,該方法將封裝互斥對象,包括在需要時生成監視對象,然后將其刪除。 當然,我也必須在runSafe內獲取ID。

在某些庫中是否開箱即用?

您可以使用所需的工具,但必須自己組裝解決方案,例如ReentrantLocks 的映射

據我所知,沒有任何現成的解決方案可以解決您在JDK中面臨的問題。

但是番石榴具有Striped ,幾乎可以滿足您的需求。 它不關聯每個ID的鎖,而是關聯ID的“條帶”的鎖。 這應該足以避免爭執。

您可以使用ID id;代替long id ID id; ID是您定義的類。 然后,您可以簡單地鎖定id對象。

您的ID類可以具有數值,也可以具有其他方便的屬性。

暫無
暫無

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

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