2016-03-20 12 views
3

私は、クラスオブジェクトの静的同期ロックと、オブジェクトインスタンスの非静的ロックを理解しています。 Static versus non-static lock object in synchronized blockスレッド内の静的同期と非静的同期メソッドの違い

あなたは非静的ロックオブジェクトを使用します:この質問のために受け入れ答えでしかし

1つの呼び出しは(o1.foo

  • スレッド)
  • スレッド2件の通話スレッド1が終了するのを待たなければならないでしょう
  • スレッド3を呼び出すo2.foo()、スレッド1と2を指定しないでそのまま続けることができます

なぜスレッド3はスレッド1とスレッド2を意識せずに続行できますか?スレッド3は、スレッド1またはスレッド2からオブジェクトインスタンス 'this'のロックを取得するまで待機する必要がありますか?

+1

質問をさらに指定できますか?あなたが尋ねた質問は、あなたが提供したリンクで回答されているので、それらは異なるObjectインスタンスなので、スレッド3はスレッド1と2の別のロックでロックしています。 – Nier

+0

はい、私は彼らが同じインスタンスであると思っていました。 –

答えて

2

なぜそれが別のオブジェクトをロックしているので、スレッド1と2

についてずに続けるだけで3スレッドすることができます。

はずの糸3は糸1又は2のいずれかから「この」オブジェクトインスタンスのロックを取得するために待機する必要

(.... o1o2が同じオブジェクトを参照するために起こる場合を除き)それが進むことができる前に?

いいえ。これらの呼び出しは、それぞれo1o2に同期しようとします(つまり、ロックします)。これらは、foo()メソッド呼び出しが開始されたときに、それぞれのスレッドに対してthisになります。呼び出しコンテキスト内の各スレッドのthisは関係ありません。

関連する問題