4

インタビューで、2 つのスレッドが同期ブロックに同時にアクセスする方法について尋ねられましたが、それが起こるシナリオを思いつきません。2 つのスレッドが同期ブロックに同時にアクセスすることは可能ですか?

4

5 に答える 5

4

ブロックを同期化する理由は、2 つのスレッドがそのブロックに同時にアクセスするのを防ぐためです。もちろん、これは 2 つのスレッドが同じオブジェクトで同期する場合にのみ当てはまります。たとえば、次のようなことをするとします。

synchronized (new Object()) {
// Multiple threads can execute here at the same time.
}

複数のスレッドを同じブロックで同時に実行できます。

于 2013-11-11T07:22:31.513 に答える
2

同期ブロックの全体的な目的は、あなたが求めていることを防ぐことなので、同期ブロックを削除する必要があります。

于 2013-11-11T07:23:18.350 に答える
0

同期ブロックに入るスレッドが、ブロックが定義されているのと同じロックを参照する場合、これは不可能です。

ただし、質問が一般的な「同期ブロック」に関するものであり、取得されているロック オブジェクトについて言及していない場合、これは許可されます。例えば:

public class MyStats {  
  private long total;
  private int count;

  public void add(long value) {
    synchronized(this) {
      this.total += value;
      this.count++;
    }
  }

  public static void main(String[] args) {
    final MyStats s1 = new MyStats();
    final MyStats s2 = new MyStats();

    Thread t1 = new Thread() {
      public void run() {
        s1.add(100);
      }
    };

    Thread t2 = new Thread() {
      public void run() {
        s2.add(200);
      }
    };
    ....
  }
}

この例では、スレッド t1 が s1 で動作し、スレッド t2 が s2 で動作するため、スレッドが同時に同期ブロック内にあることを妨げるものは何もありません。スレッドは異なるロックを使用しています。相互排除は、スコープを定義するだけの同期ブロックではなく、ロック インスタンスによって決定されます。

于 2013-11-11T09:07:22.903 に答える