2012-04-27 23 views
1

私はスレッド同期に関するいくつかの混乱があります。私は2つのスレッドスレッド1スレッド2と2方法同期foo1は()foo2は()を持って考えてみましょう。 foo1()はと同期されたメソッドであり、foo2()はそうではなく、内部的にfoo2()を呼び出すステートメントがあり、Thread1がfoo1()を呼び出し、foo2() Thread2は、同期されていないfoo2()メソッドに直接アクセスします。スレッドセーフな同期ブロック

私の質問は だから、Thread2はFoo2()のアクセス権を得るのだろうか?スレッド1がそのタスクを完了するのを待ちますか?

+1

あなたの問題を正確に説明/再現してください。 –

+0

はい、私はこれらの指示に従います、あなたの素早い返答をありがとう。 –

答えて

3

ロックされているメソッドではなく、オブジェクトです。つまり、異なるオブジェクトにアクセスしている場合、foo1()に2つのスレッドを持つことができます。彼らが同じオブジェクトにアクセスしている場合、同じロックは、最初に呼び出されたものと何が呼び出されたのかにかかわらず、同時アクセスを防ぎます。

BTW:foo1()は既にロックを持っているので、自分自身を呼び出すことができます。

+2

+1これはオブジェクトであり、ロックされているメソッドではありません – amod

+2

混乱の原因は、メソッドがsynchronizedとしてラベル付けされていることですが、ロックされているメソッドではありません。 ;) –

+2

Peter Lawreyのコメントを拡張するには、 'public synchronized void foo(){...}'は実際には 'public void foo(){synchronized(this){...}}'を意味します。 – Anonymoose

4

foo2()が同期されていない場合、どのスレッドもブロックされずにいつでも呼び出すことができます。スレッドがそれ自体が同期している別のメソッドからスレッドを呼び出すかどうかは、何の違いもありません。

1

スレッド2はブロックされず、待機しません。 同期していないので、Foo2の実行を開始します。

0

foo2は()ではない同期メソッドは、そのいずれかのスレッドがそれを呼び出すと、現在のオブジェクトのモニターを取得できないため、スレッド2は、直接foo2は()を呼び出すことができます。いつでもあなたができる短いコードスニペットを投稿することが推奨され

関連する問題