0

私のプロジェクトでは、多くのメソッドを提供するクラスXを使用する必要がありますが、これらのメソッドがスレッドセーフであるかどうかはドキュメントに記載されていません。どちらか。Javaスレッドの安全性のためのfinal final mutex

だから私は、ミューテックスで、他のクラスのXをカプセル化しています

public class MyX { 
    private X instance; 
    public final Object mutex = new Object(); 
    public MyX() { 
     this.instance = new X(); 
    } 
    public X getMethods() { 
     return this.instance; 
    } 
} 

私はXのメソッドを呼び出す必要があるとき、私は​​ブロックを使用します。

MyX myX = new MyX(); 
synchronized (myX.mutex) { 
    X methods = myX.getMethods(); 
    methods.method1(); 
    methods.method2(); 
    ... ... ... 
} 

か、多分私をXのインスタンスで直接同期することができます。

X instance = new X(); 
synchronized(instance) { 
    instance.method1(); 
    instance.method2(); 
    ... ... ... 
} 

どちらの方が良いか知りたいのですが、この問題のより良いデザインがあります。

ありがとうございました。

答えて

3

同じクラスの2つのメソッドの間で同期をとる場合は、mutexを選択する必要があります。

公開変数としてmutexを公開することは、オブジェクト指向の原則に反するため、推奨されません。

クラス外から作業しているときに、作業しているオブジェクトのロックを取得することが最善の選択肢です。

X instance = new X(); 
synchronized(instance) { 
instance.method1(); 
instance.method2(); 
... ... ... 
} 
+0

@Anand Vaidyaありがとうございます。私のプログラムでは、いくつかのスレッドは 'X'クラスの同じインスタンスを共有します。私は次に2番目の方法を選ぶでしょう。 – vesontio

+0

もう1つ質問がありますが、 'synchronized(instance)'は 'public synchronized void method1()'と同じですか? – vesontio

+0

はい。あるスレッドがオブジェクトの同期メソッドを実行しているとき、そのオブジェクトで最初のスレッドが完了するまで、同じオブジェクトブロックの同期メソッドを呼び出す他のすべてのスレッド(実行を中断)。 http://stackoverflow.com/questions/9196723/learning-java-use-of-synchronized-keyword –