3

Java メソッドの同期に関する問題に直面しています。簡単に説明できれば幸いです。

2 つの異なるパッケージの 2 つの異なるクラスに 2 つの異なるメソッドがあります。何かのようなもの:

Package1
     |_Class1
            \MethodA

Package2
     |_Class2
            \MethodB

では、これら 2 つのメソッドを同期する必要がありますが、これはスレッドではありません。これまでのところ、2 つの異なるアプローチがあります。

共有セマフォ

Package1と の外側にPackage2、次のような共有静的セマフォを作成します。

 package Package3;

 public class SemaphoreClass {

    public static Semaphore;

}

とにかく、JVMがこれを共有セマフォと見なすかどうかはよくわかりません。

同期 (SharedClass.class)

共有クラスを使用して、次のようにこれら 2 つのメソッドを同期します。

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

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

とにかく、これらは単なるアプローチです。私が達成しようとしていることを実装するための最良の方法は何かを聞きたいです。JVM 用の共有セマフォがあれば作業は簡単になりますが、これには解決策が必要であることはわかっています。前もって感謝します。

4

1 に答える 1

5

どちらのアプローチも機能するはずですが、クラスをロックすることは推奨される方法ではないと思います。のインスタンスのロックを優先するObjectか、 から適切なロックを使用してくださいjava.util。また、ロックオンしないでくださいString

または、クラスのインスタンスを許可し、インスタンス化中にパラメーターとしてロックClass1Class2取得できます。

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

次に、( を使用して) 1 つのロックを作成new Object()し、それを と の 2 つのインスタンスに渡しClass1ますClass2

したがって、基本的に、元の問題を 2 つに分割しました。1) 2 つのクラスは静的にグローバルなものを共有せず、パラメーターを受け取るだけです。2) と のクライアントはClass1Class2正しいロックを渡す必要があります。Class1andのクライアントはClass2、「オーケストレーター」として機能します。

于 2013-06-19T09:17:33.063 に答える