[英]Implementing a global lock in Java
關於Java中的同步,我有一個相對簡單(也許是愚蠢的)問題。
我有同步塊,在我的代碼中獲取各種對象的鎖。 在某些情況下,我想獲取一個全局鎖,它包含我的代碼中的每個其他同步語句。
有沒有一種奇特的方法在Java中執行此操作而不重寫所有當前的同步代碼?
例如,
synchronized (o1)
{
synchronized (o2)
{
// ...
}
}
synchronized (global_lock)
{
// ...
}
當線程t2在同步塊內時,不應允許線程t1獲取o1和o2上的鎖。
非常感謝,如果
它容易出現死鎖,因為它會迫使您對所有鎖具有預先確定的鎖定順序,無論它們位於何處。
通常這是一個好主意,如果你需要獲得兩個鎖,總是有一個預定的順序:
synchronized(LOCK1) {
synchronized(LOCK2) {
}
}
但是全局鎖需要某種協議 - 全局采購訂單 - 用於所有鎖。 這根本不可能。 大多數鎖具保護特定的,獨立的關鍵部分。 他們不會意識到有人會“猛拉”他們並獲取他們,因此不會被寫入來處理這種情況。
所以這是不可能的,你應該感到高興它不是。 雖然這似乎是一個簡單的方法,但它會帶來很多痛苦。
撇開你提議的絕對恐怖,你可能想要考慮使用面向方面編程(AOP)在運行時“編織”代碼中的額外同步/鎖定。 您應該能夠在不編寫源代碼的情況下執行此操作。
有許多AOP選項,包括AspectJ和Spring AOP,它們可能適合您的環境。
唯一可行的方法是實際解析/修改/保存(自動)所有代碼。 我最近為一個項目做了類似的事情並且工作得非常好。 如果您有興趣,我們可以多說。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.