0

そのタイプのスレッドクラスのすべてのオブジェクトが一度に1つだけこの関数にアクセスできるように、同期メソッドを作成したいと思います。

このWebページを見ると、次のようになっています。

アクセスが調整されるオブジェクトは、同期されたメソッドを使用してアクセスされます。これらのメソッドは、synchronizedキーワードで宣言されています。特定の時点でオブジェクトに対して呼び出すことができる同期メソッドは1つだけです。これにより、複数のスレッドで同期されたメソッドが互いに競合するのを防ぎます。

私が言ったように、これは私が探しているものではありません。なぜなら、クラスで相互に排他的に呼び出しを行えるようにしたいからです。

4

3 に答える 3

1

(クラスの特定のインスタンスではなく)クラスでメソッドを同期させるには、次のように記述します。

public static synchronized ReturnType methodName() {
  ...
}

また

public static ReturnType methodName() {
  synchronized(ThisClass.class) {
    ...
  }
}
于 2012-09-21T01:59:42.490 に答える
0

後世のためにもう少し情報を提供したいと思いました。

クラスで相互に排他的に呼び出しを行えるようにしたい。

したがって、クラスのインスタンスのロックについて話しているのか、クラスのすべてのインスタンスのロックについて話しているのかによって異なります。オブジェクトで同期しているときに、他のスレッドが同じオブジェクトインスタンスをロックすると、他のスレッドがブロックされます。

インスタンスメソッドがsynchronizedである場合、それはロックオンしている場合ですthis。以下は同じです:

  public void synchronized foo() {
     ...
  }

と同じ:

  public void foo() {
     synchronized (this) {
        ...
     }
  }

通常、@ Tudorが言及しているように、メソッドを作成する代わりにロックオブジェクトの使用を検討する必要がありますsynchronized。これにより、保護したい特定の線をロックすることができます。

クラスの同じインスタンスsynchronizedへの他の呼び出しをブロックするインスタンスメソッド。代わりに、クラスのすべてのインスタンスをブロックする場合は、@ JimNが推奨することを実行し、静的メソッドを同期します。彼が言及しているように、それはクラスオブジェクトで同期することと同じです。

public static synchronized ReturnType methodName() {

何らかの理由ですべてのオブジェクトをロックする必要がある場合は、ロックをシングルトンでラップし、を使用していくつかのロック/ロック解除メソッドを記述しますReentrantLock

于 2012-09-25T21:46:51.350 に答える
0

静的ロックを使用します。

private final static Object lock = new Object();

public void foo() {
    synchronized(lock) {
        ...
    }
}
于 2012-09-21T08:21:36.250 に答える