2012-01-05 5 views
1

単純なファイル書き込み操作を実行するRunnableがあり、このRunnableがExecutorとともに呼び出されたとします。シングルスレッドのExecutorのクラスであることExecutorでExecutorのRunnable内の変数

..

public void doThis() { 
    executor.execute(new Runnable() { 
     @Override 
     public void run() { 
      file.write(_data); 
     } 
    }); 
} 

はモーメントが実行保存されます_Dataの即時内容は()と呼ばれているのでしょうか?つまり、実行可能ファイルがキューに登録されると、_dataに変更を加えることができ、その変更はファイルに書き込まれません。

_data = something 
doThis(); 
_data = something else 

私はfile.write(他の何か)を行うことになるでしょうか?

答えて

1

いいえ、3番目の質問にyes ...エグゼキュータが実行している1つのスレッドが呼び出し側スレッドとは別のスレッドである場合、これはスレッドセーフな操作ではありません。 .execute()が呼び出し側と同じスレッド上で実行されない限り、.writeが完了するまで_dataを変更しないでください。

これを回避する一般的な方法は、_dataのコピーを実行者に渡す前に単純にコピーすることです。

+0

この問題は、_dataに多くの変更が加えられ、新しい_dataですぐにexecute()を呼び出すことになります。この場合、私は唯一の選択は、何らかのデータ構造_dataを実装することだと思うので、execute()は常に_data []で動作します。 –

+0

類似の質問が掲載されています(http://stackoverflow.com/questions/8147015/executor-execute-jmm-guarantee)。ここでは、メモリの一貫性と、メモリの一貫性の影響について説明しました。エグゼキュータにRunnableオブジェクトを送信すると、実行が開始される前に、おそらく別のスレッドで実行されます。 私は同じロジックで、_data =何かがdoThis()の前に起こらないことを期待していました。しかし、私は、「スレッドの前に起こっている動作」が何を意味するかについてはあまりよく分かりません。それでも可能でしょうか? –

関連する問題