1

単純なファイル書き込み操作を実行するRunnableがあり、このRunnableがエグゼキュータで呼び出されたとします。

エグゼキュータはシングルスレッドのエグゼキュータクラスです。

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

execute()が呼び出された瞬間に、_dataの直接の内容が保存されますか?つまり、ランナブルがキューに送信されると、先に進んで_dataに変更を加えることができ、変更はファイルに書き込まれませんか?

_data = something
doThis();
_data = something else

file.write(何か他のもの)を実行してしまう可能性はありますか?

4

1 に答える 1

1

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

これを回避する一般的な方法は、エグゼキュータに渡す前に_dataのコピーを作成することです。

于 2012-01-05T20:07:57.417 に答える