2013-06-19 108 views
2

我正面臨有關Java方法同步的問題。讓我們希望我可以簡單地解釋它:在不同的類(和不同的包)中同步兩種方法

我有兩個不同的方法在兩個不同的類,在兩個不同的包。喜歡的東西:

Package1 
    |_Class1 
      \MethodA 

Package2 
    |_Class2 
      \MethodB 

好了,現在我需要這兩種方法,這是不是線程同步。到目前爲止,我有兩種不同的方法:

共享信號量

Package1Package2創建一個共享的靜態信號,是這樣的:

package Package3; 

public class SemaphoreClass { 

    public static Semaphore; 

} 

我真的不知道,如果JVM會認爲這是一個共享的信號,無論如何。

Synchronized(SharedClass.class)

使用共享類這兩種方法實現同步,是這樣的:

public void MethodA() { 
     synchronized (SharedClass.class) { 
      //... 
     } 

public void MethodB() { 
     synchronized (SharedClass.class) { 
      //... 
     } 

不管怎樣,這些都只是接近。我想聽聽實現我想實現的最佳方式是什麼。擁有JVM的共享信號會讓事情變得更容易,但是,我知道必須有解決方案。提前致謝。

+3

信號量解決方案是好的......但是不要忘記在'finally'塊中釋放它! – fge

+0

事實上,類在不同的包中是不相關的,你可以按照同步一個類的實例的方式同步它的實例。 – SJuan76

+1

@ SJuan76我知道這不是真的相關,所以我把它們放在「()」裏面;) –

回答

3

你的兩種方法都應該可以工作,但我不認爲鎖定類是推薦的做法。優先鎖定Object的實例,或使用java.util的正確鎖。另外,請勿鎖定String

或者,你可以讓類Class1Class2實例可以實例化過程中採取了鎖的參數:

class Class1 { 
     private final Object lock; 
     public Class1(Object lock) { this.lock = lock } 
     public method() { synchronize(lock) { }); 
    } 

然後確保你創建一個鎖(帶new Object()),並把它傳遞給兩個實例Class1Class2。所以基本上,你已經把原來的問題分成了兩部分:1)兩個類不共享任何靜態全局的東西,它們只是接收一個參數。 2)Class1Class2的客戶端必須通過正確的鎖定。 Class1Class2的客戶端充當「協調者」。