2009-08-14 13 views
1

同期メソッドから呼び出された非同期メソッドはスレッドをブロックできますか?スレッドがfoo()がバーを確実にするために、とにかくそこにあるを実行している場合は、スレッドがスリープする前に javaスレッドのブロック

public synchronized void foo(){ 
someStuff(); 
someMoreStuff(); 
bar(); 
} 

public void bar(){ 
//... does some things 
} 

()が呼び出されますか?

TIA

答えて

3

スレッドは常に横取りすることができる(Javaでいることを防止する方法はありません)が、他のスレッドはfoo戻る前に、同じオブジェクトのロックを取得することはできないであろう。スレッドは「CPUを失う」という

注は通常「ブロック」の意味だものではありません - 通常の呼び出しは、それが発生する他の何かを待つ必要がある場合には、ブロックとみなされます。

  • 利用可能ないくつかのデータロックこれらは

利用可能になるまで

  • ロックブロックを取得(またはストリームの終わりに達している)があるまでストリームブロックからの読み取り:例えば非常には、時間切れのスライスとはまったく異なります。

  • +0

    説明のためにありがとう、このものは簡単ではありません:) – javamonkey79

    1

    は、Java VMのCPUを取り、別のスレッドが実行させないことを保証する方法があります場合は、求めていますか?スレッドの優先順位を高く設定することはできますが、これはまったく保証を提供しません。

    んが、他のスレッドは、しかし、あなたはCPUを持っていない間、あなたの「foo」というメソッドを呼び出すことができなくなります。同様に、 "bar"を同期すると、 "foo"の呼び出しが完了するまで( "foo"メソッドの全期間ロックを所有している)、呼び出されなくなります。

    1

    foo()の実行中にあるスレッドがオブジェクトにロックを保持している間に、他のスレッドがbar()を自由に呼び出せるかどうかという疑問があるようです。特に、2つ以上のスレッドが同時にbar()を実行できる場合

    そして答えはいずれかのスレッドが時間内の任意の一点において)そうそう、(複数のスレッド実行中のバーがあることができ、いつでもバー()を実行できるということです。

    関連する問題