Переменные внутри Runecable исполнителя - PullRequest
1 голос
/ 05 января 2012

Предположим, у меня есть Runnable, который выполняет простую операцию записи файла, и этот Runnable вызывается с исполнителем.

С исполнителем, являющимся однопоточным классом Executor ..

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

сохраняется ли непосредственное содержимое _data в момент вызова execute ()? Что означает, что после того, как исполняемый файл был отправлен в очередь, я могу продолжить и внести изменения в _data, и эти изменения не будут записаны в файл?

_data = something
doThis();
_data = something else

есть ли вероятность, что я в конечном итоге буду выполнять file.write (что-то еще)?

1 Ответ

1 голос
/ 06 января 2012

нет на ваш первый и второй вопросы, и да на ваш третий вопрос ... если единственный поток, на котором работает исполнитель, является отдельным потоком от вызывающего потока, то это не потокобезопасная операция.если .execute () не выполняется в том же потоке, что и вызывающая сторона, вам следует избегать внесения изменений в _data до тех пор, пока не будет сделано .write.

Обычный способ обойти это - просто сделать копию _dataперед передачей исполнителю.

...