0

synchronized(this)スレッドがブロックに入るときとブロックに入るときに実際に何が起こるかについてのメカニズムをよりよく理解したいと思いsynchronized(someObjectReference)ます。

    synchronized (this) {
        // Statement 1
        // Statement 2
    }

    synchronized (someObjectReference) {
        // Statement 1
        // Statement 2
    }

私が理解しているように:(私は何かが足りないのですか?私は間違っていますか?)

  • どちらの場合も、一度に1つのスレッドのみが同期ブロックにアクセスできます
  • 同期しているときsomeObjectReference
    • このブロックでは、一度に1つのスレッドのみがアクセス/変更できます。
    • このブロックに入ることができるのは、一度に1つのスレッドのみです。

他にどんなメカニズムがありますか?

    synchronized (objectReference) {
        // Statement 1 dealing with someObjectReference
        // Statement 2 not dealing with someObjectReference
    }

mutex上記の例では、同期されたブロックに処理しないステートメントを追加することは意味がありますか?

4

4 に答える 4

2

2つを一緒に混ぜるときだけ違いがあります。

の単一の基本的なルールは、常に1つのスレッドのみが同じブロックに入るsynchronized(foo)ことができるということです。それだけです。 (言及する価値のある唯一の注意点は、スレッドが同じものの複数のネストされたブロック内にある可能性があることです。)synchronized(foo)foosynchronized(foo)foo

一部のコードがsynchronized(foo)ブロック内にあり、一部のコードがブロック内にあるsynchronized(bar)場合、それらのコードは同時に実行できますが、2つのスレッドでsynchronized(foo)ブロック内のコードを同時に実行することはできません。

于 2012-07-07T18:25:02.290 に答える
1

どちらの場合も、一度に1つのスレッドのみが同期ブロックにアクセスできます

あまり。たとえば、「this」で同期する場合、同じクラスの2つの異なるインスタンスがある場合、2つのスレッドが同じブロックにアクセスできます。ただし、はい、1つのインスタンスでは、ブロックへのアクセスは1つだけです。また、これで同期されたブロックへのアクセスは1つだけになります

「同期済み」とは、同じインスタンス上の同期済みブロックにアクセスできるのは1つのスレッドのみであることを意味します。したがって、2つの異なるソースファイルに2つの同期ブロックがあるが、同じインスタンスで、1つのスレッドがそれらのブロックのいずれかにある場合、別のスレッドは両方の同期ブロックにアクセスできません。

「同期ブロック内で行うこと」について:同期オブジェクトを処理することのみを実行します。同期を必要としない他の命令は、リソースを無料でロックし、ボトルネックを作成する可能性があります

于 2012-07-07T18:25:06.930 に答える
0

同期とは、基本的に、指定されたオブジェクトをロックするプログラム要求を意味します...スレッドが同期ブロックに入ることができない場合、それは他のスレッドが指定されたオブジェクトをすでにロックしていることを意味します。ロックが正常に取得された場合にスレッドが入ることができる領域。

 In both cases, only 1 thread can access synchronized block at a time

-ロックするオブジェクトによって異なります可用性

于 2012-07-07T18:24:25.893 に答える
0

this可視性との取引の同期について注意すべき重要なことの1つ。クラスがAあり、で同期するとしthisます。を使用するコードには、ロックオンに使用してAいるオブジェクトへの参照があります。Aこれは、のユーザーがインスタンスAもロックしている場合、デッドロックを作成できることを意味しAます。

public class A implements Runnable {
  public void run() {
    synchronized (this) {
      // something that blocks waiting for a signal
    }
    //other code
  }
}

public class DeadLock {
  public void deadLock() {
    A a = new A();
    Thread t = new Thread(a);
    t.start();

    Thread.sleep(5000); //make sure other thread starts and enters synchronized block
    synchronized (a) {
      // THIS CODE BLOCK NEVER EXECUTES
      // signal a
    }
  }
}

一方、プライベートメンバー変数で常に同期する場合は、その参照をロックとして使用しているのは自分だけであることがわかります。

于 2012-07-09T12:43:36.043 に答える