2017-10-20 9 views
-1

私は一度に1つのスレッドでアクセスできるメソッドを持っています。スレッドが異なるオブジェクトを使用しても、一度に1つのスレッドだけがメソッドにアクセスする必要があります。複数のオブジェクトを使用する複数のスレッドが相互に排他的なコードの一部にアクセスできるようにする方法

これを達成するには、Javaで何が使えますか? 「synchronized」キーワードは、異なるオブジェクトを使用する場合、一度に複数のスレッドがメソッドにアクセスできるようにします。 私が信じているRe-Entrantロックと同じ。

+0

共有オブジェクトをロックします。 'static'フィールドに格納された' ReentrantLock'を使うか、 'static'フィールドに格納された' Object'に 'synchronized'を使います。 – Andreas

答えて

1

ここにはいくつかのバリエーションがあります。私が正しい質問を理解すれば、あなたは#5を探していると思います。

// 1. Static method 
public static synchronized void doSomething() { 
    // Mutually exclusive for all calls 
} 

// 2. Static w/ Shared lock 
private static Object STATIC_LOCK = new Object(); 

public static void staticMethod1() { 
    synchronized (STATIC_LOCK) { 
     // Mutually exclusive across staticMethod1() and staticMethod2() 
    } 
} 

public static void staticMethod2() { 
    synchronized (STATIC_LOCK) { 
     // Mutually exclusive across staticMethod1() and staticMethod2() 
    } 
} 

// 3. Instance method 
public synchronized void doSomethingElse() { 
    // Mutually exclusive per instance of class 
} 

// 4. Instance w/ Shared lock 
private Object lock = new Object(); 

public static void method1() { 
    synchronized (lock) { 
     // Mutually exclusive across method1() and method2() for each class instance 
    } 
} 

public static void method2() { 
    synchronized (lock) { 
     // Mutually exclusive across method1() and method2() for each class instance 
    } 
} 

// 5. Instance method synchronization across multiple class instances 
private static Object SHARED_LOCK = new Object(); 

public void commonInstanceMethod() { 
    synchronized (SHARED_LOCK) { 
     // Mutually exclusive across all class instances 
    } 
} 
+0

私は最初のものを使用しています。オブジェクトの数にかかわらず、1つのスレッドしかアクセスできないためです。 – hars

+0

@hars:#1と#5は本質的に同じものです。 –

+0

#1では、「静的同期メソッド」を使用すると、メソッド内で静的コンテンツを使用する必要があることがわかりました。 だから私は#5を使い始めました。これはかなり良い方法です。これを使用する場合、他の変更は必要ありません。 – hars

関連する問題