0

現在、これは機能しているようですが、いつかバグが発生する可能性があります。

ブール値の2次元配列があります。これらのブール値は、さまざまなオブジェクトの状態を表します(処理の準備ができているかどうか)。

スレッドが実行され、それらのオブジェクトが作成されます。オブジェクトが作成されると、ブール値が「true」に設定されます(オブジェクトの作成には最大20ミリ秒かかります)。

私の質問は:

スレッドが魔法をかけている間にこの配列を読み取る(読み取るだけ)ことはできますか?私のメソッドがスレッドを読み取っているときにスレッドがtrueを書き込むとしたら、どうなるでしょうか。

ありがとう。

4

2 に答える 2

2

への書き込みbooleanはアトミックであるため、矛盾は見られません。これは、longおよびには当てはまりませんdouble

あなたに起こりうる最悪の事態は可視性です。1 つのスレッドが特定の変数を更新したが、他のスレッドがその変更をすぐに (または決して) 認識しない場合、可視性の問題が発生します。

すべてのスレッドが同じ最新の値を参照できるようにするには、何らかの同期またはvolatileフィールドを使用する必要があります。

于 2012-07-20T16:30:50.827 に答える
1

スレッドが魔法をかけている間にこの配列を読み取る(読み取るだけ)ことはできますか?私のメソッドがスレッドを読み取っているときにスレッドがtrueを書き込むとしたら、どうなるでしょうか。

はい、あなたはそれをうまく読むことができます、あなたがそれに書き込みを試みるならば、あなたはあなた自身が厄介な状況にいることに気付くかもしれません。2番目の質問については、非常に簡単に言えば、それは不可能です。インデックスが変更されているのとまったく同じ瞬間にそのインデックスを読み取ることはできません。書き込みが完了するまで待機し、書き込みの直前にあるものを読み取ります。

于 2012-07-20T16:28:52.110 に答える