2017-03-19 16 views
1

同期されたメソッドm1と同期されていないメソッドm2を持つクラスTestがあり、Testのインスタンスはobj2個のスレッドT1およびT2にしようとします。インスタンスobjに関連するアクセスメソッド。 T1がobj.m1(同期メソッド)を呼び出し、m1の実行を完了する前に、T2がobj.m2(非同期)を呼び出すとどうなりますか。 T2は待たなければなりませんか?同じオブジェクト上の同期および非同期のメソッドにアクセスする複数のスレッド

私はインタビューでこの質問をしました。

私の回答: T2は待ち時間なく実行し続けます。 T2が非同期メソッドにアクセスしているため、ロックが必要ありません。

インタビュアーは私の答えに同意していないようですが、私は彼に私の答えの正しさについて尋ねたところ、何も入力しませんでした。

何か不足している場合は、私にご理解ください。

P.S.私はすでにテストプログラムを試していますが、私の理解が正しいことがわかります。私はインタビュアーに説明したようにこれがうまくいかない特別なシナリオがあるかどうか疑問に思っています。

+1

なぜテストしませんか?あなたの質問を書くよりも速いでしょう。 –

+1

2つのスレッドが同じロックを同時に保持しようとする場所をブロックします。異なるロックまたはロックなしは効果がありません。これは、どのメソッドがどのオブジェクトで呼び出されているかに関係なくです。 –

+0

おそらくインタビュアーがもっと探し求めていたのかもしれません。あるいは、別の候補者から与えられた答えが、それについてより良くなったことを具体的に知らなくても良いと思ったのかもしれません。 –

答えて

3

あなたは正しいと答えていますが、小さな回答が面接者を幸せにしてくれなかったか、彼はより高い期待を持っていて、彼の質問について非常に明確な説明が必要でした。

私はあなたの質問に答えるためのコードを書いていませんが、私はjavaのmulti-threadingの基本を強調する2つの点を述べます。

1)各オブジェクトにはロックが1つしかありません。

2)T1とT2が同じオブジェクトで同期インスタンスメソッドを実行しようとしているとすると、最初にロックを取得したスレッドはsynchronizedメソッドを実行でき、もう一方のスレッドT2は待機する必要がありますT1がその実行を完了するか、いくつかの理由のためにブロッキング/待機状態に入るまで。言い換えれば、スレッドT1がすでに同じオブジェクトobjのロックを持っている場合、いいえスレッドT2は、オブジェクト "obj"に対してANY(私は何度も繰り返します)​​メソッドを入力できません。

3)クラスが同期メソッドと非同期メソッドの両方を持つ場合、任意の数のスレッドは、誰かまたは何かを待つことなく、任意の方法で非同期メソッドにアクセスできます。

スレッドT2は、スレッドT1が非同期メソッドを実行しようとしているときに実行を完了するのを待つ必要はありません。希望この答えはあなたの期待に応えます。

私はあなたがあなたの質問

P.S.を編集した参照

私はすでにテストプログラムを試しましたが、私の理解が正しいことがわかります。私はインタビュアーに説明したようにこれがうまくいかない特別なシナリオがあるかどうか疑問に思っています。
このようなシナリオはありません。上記の点はあなたの質問に合っているはずです。

+0

ありがとうAdil、私は同じ理解を持っています、どんな答えが期待されていたか分かりません。 私は自分自身を試して同じ結果を見つけたことを知らせるために自分の質問を編集しましたが、何の努力もせずに質問を投稿しませんでした:) – Akshay

+0

問題はありません。あなたが助けてくれれば回答を選択してください: – Adil

+0

答えが受け入れられましたが、point2を修正してください。T2は言うことができますが、T2はできません。 – Akshay

関連する問題