Предотвратить удаление текстового файла при доступе из нескольких потоков

Модификация в списке разрешена. Ваши примеры кода arbove довольно искажены ...

myList = [1, 2, 3, 4, 5]
for index in range(0,len(myList)):
   myList[index] += 1
 print myList

Это работает.

0
задан Gray 6 March 2019 в 19:36
поделиться

1 ответ

К сожалению, очень сложно предоставить отзыв о вашем коде без тонны дополнительной информации, но, надеюсь, мои комментарии будут полезны.

В общем, иметь несколько потоков, читающих и пишущих из одного и того же файла, - действительно плохая идея. Я не могу больше согласиться с @ Hovercraft-Full-Of-Eels, который рекомендует, чтобы у вас была нить 1 для чтения / записи, а другие нити просто добавляли обновления в общую BlockingQueue.

Но это сказал, что вот некоторые комментарии.

Если setAndReplace () объявлен как static + синхронизированный, исходные данные реквизита сохраняются.

Правильно, это останавливает ужасное состояние гонки в вашем коде, когда 2 потока могут пытаться записать в выходной файл одновременно. Или может быть так, что 1 поток начинает запись , а другой поток читает пустой файл, что приводит к потере данных.

Если JVM уничтожена / прервана (после вызова FileOutputStream), тогда предыдущие данные будут удалены.

Я не совсем понимаю эту часть, но в вашем коде должны быть хорошие предложения try / finally, чтобы убедиться, что файлы закрываются надлежащим образом после завершения JVM. Если JVM жестко уничтожена, файл может быть открыт, но еще не записан (в зависимости от времени). В этом случае я бы порекомендовал вам записать во временный файл и переименовать в свой файл свойств, который является атомарным. Тогда вы можете пропустить обновление, если JVM уничтожена, но файл никогда не будет перезаписан и будет пустым.

Если я удалю статические и синхронизированные модификаторы из setAndReplace () и вызову setAndReplace () 5000 раз, старые данные все еще сохранятся (почему?)

Понятия не имею. Зависит от условий гонки. Может, тебе просто везет.

Когда я пытаюсь изменить файл props с помощью ExecutorService (иногда я получаю доступ к setAndReplacePropValue () через ExecutorService в моей программе), содержимое файла сохраняется до тех пор, пока не будет задержки после FileOutputStream. Если я добавлю задержку, и задержка будет> значением «тайм-аута», установленным в future.get () (так, чтобы генерировалось прерванное исключение), данные НЕ сохраняются. Это остается верным, даже если я добавлю статические + синхронизированные ключевые слова в метод.

Я не могу ответить на этот вопрос, не увидев конкретный код.

Это было бы хорошей идеей, если бы у вас был фиксированный пул потоков с 1 потоком, тогда каждый из потоков, которые хотят обновить значение, просто отправил бы объект поля / значения в пул потоков. Это примерно то, о чем говорил @ Hovercraft-Full-Of-Eels.

Надеюсь, это поможет.

0
ответ дан Gray 6 March 2019 в 19:36
поделиться