簡體   English   中英

在Java中實現全局鎖

[英]Implementing a global lock in Java

關於Java中的同步,我有一個相對簡單(也許是愚蠢的)問題。

我有同步塊,在我的代碼中獲取各種對象的鎖。 在某些情況下,我想獲取一個全局鎖,它包含我的代碼中的每個其他同步語句。

有沒有一種奇特的方法在Java中執行此操作而不重寫所有當前的同步代碼?

例如,

線程t1

synchronized (o1)
{
    synchronized (o2)
    {
        // ...
    }
}

線程t2

synchronized (global_lock)
{
    // ...
}

當線程t2在同步塊內時,不應允許線程t1獲取o1和o2上的鎖。

非常感謝,如果

  1. 這是不可能的;
  2. 這是一個非常糟糕的主意(對不起)。

它容易出現死鎖,因為它會迫使您對所有鎖具有預先確定的鎖定順序,無論它們位於何處。

通常這是一個好主意,如果你需要獲得兩個鎖,總是有一個預定的順序:

synchronized(LOCK1) {
  synchronized(LOCK2) {

  }
}

但是全局鎖需要某種協議 - 全局采購訂單 - 用於所有鎖。 這根本不可能。 大多數鎖具保護特定的,獨立的關鍵部分。 他們不會意識到有人會“猛拉”他們並獲取他們,因此不會被寫入來處理這種情況。

所以這是不可能的,你應該感到高興它不是。 雖然這似乎是一個簡單的方法,但它會帶來很多痛苦。

撇開你提議的絕對恐怖,你可能想要考慮使用面向方面編程(AOP)在運行時“編織”代碼中的額外同步/鎖定。 您應該能夠在不編寫源代碼的情況下執行此操作。

有許多AOP選項,包括AspectJ和Spring AOP,它們可能適合您的環境。

唯一可行的方法是實際解析/修改/保存(自動)所有代碼。 我最近為一個項目做了類似的事情並且工作得非常好。 如果您有興趣,我們可以多說。

暫無
暫無

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

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