2013-11-23 3 views
5

同期されたブロックまたはメソッドは、内部のスレッドが "left"になるまですべてのスレッドをブロックすることを理解しています。スレッドが同期ブロック内で実行されているときにコンテキスト切り替えが発生する可能性がありますか?私の理解では、そうすべきではありません。Javaでは、同期化されたブロックでスレッドの切り替えが可能ですか?

ありがとうございます!

+1

はい、JVMではなくOSによって処理されるため、コンテキスト切り替えが発生する可能性があります。 –

答えて

9

スレッドが同期ブロック内で実行されているときにコンテキスト切り替えが発生する可能性がありますか?

はい、コンテキストスイッチは​​ブロック内でも発生する可能性があります。異なることになるのは、コンテキストがその先取りされたスレッドに切り替わるまで、他のスレッドが同じ​​ブロック(または同じオブジェクトの他のブロック​​)を入力することができないことだけです。保護されたコード。

+0

理にかなって、完璧です! – Abidi

3

あなたが理解していることは間違っています。同期ブロックは他のスレッドをブロックしません。同期ブロックは、他のスレッドが同じオブジェクト上で同期しているブロックに入るのを防ぐだけです。他のスレッドは、同期ブロックが実行されている間は実行を続けます。

もちろん、他のスレッドも自分自身を実行するための時間が必要であるため、同期化されたブロックでコンテキスト切り替えが発生する可能性があります。そうでない場合、数秒間実行される2つの同期ブロックは、2コアマシン上のすべてのブロックをブロックします。あなたは本当にそれが起こることを望んでいません。

+0

同期ブロック外のスレッドのブロックについての私の理解は正しいです。コンテキストの切り替えについてのお返事ありがとうございます。 – Abidi

+0

私はあなたの投稿によってあなたの理解を判断することができます。あなたは投稿しました*私は同期ブロックまたはメソッドは、内部が "左" *になるまですべてのスレッドをブロックすることを理解しています。 –

-2

同期ブロックを使用する主な理由は、OSで実際に行われるコンテキスト切り替えです!コンテキスト切り替えがなければ、同期ブロックの必要もありませんでした。

実際にはコンテキスト切り替えはスレッドをサポートしていません。はい、それはMS-DOSには当てはまりますが、現代のOSには当てはまりません!

0

Thinkスレッドスイッチと同期は、2つの全く異なるものです。 Synchronizeはそれほど重要ではないリソースの共有に注意します。別のスレッドは、完全に異なる何かを行うことができます。だから両者は関連していない。

1

​​の内部でコンテキストスイッチが発生する可能性があります。我々は​​ブロックでsleep()またはwait()メソッドを呼び出すことができますなど。 sleep()またはwait()は、現在のスレッドを実行不能にします。

関連する問題