Модификация в списке разрешена. Ваши примеры кода arbove довольно искажены ...
myList = [1, 2, 3, 4, 5]
for index in range(0,len(myList)):
myList[index] += 1
print myList
Это работает.
К сожалению, очень сложно предоставить отзыв о вашем коде без тонны дополнительной информации, но, надеюсь, мои комментарии будут полезны.
В общем, иметь несколько потоков, читающих и пишущих из одного и того же файла, - действительно плохая идея. Я не могу больше согласиться с @ Hovercraft-Full-Of-Eels, который рекомендует, чтобы у вас была нить 1 для чтения / записи, а другие нити просто добавляли обновления в общую BlockingQueue
.
Но это сказал, что вот некоторые комментарии.
Если setAndReplace () объявлен как static + синхронизированный, исходные данные реквизита сохраняются.
blockquote>Правильно, это останавливает ужасное состояние гонки в вашем коде, когда 2 потока могут пытаться записать в выходной файл одновременно. Или может быть так, что 1 поток начинает запись , а другой поток читает пустой файл, что приводит к потере данных.
Если JVM уничтожена / прервана (после вызова FileOutputStream), тогда предыдущие данные будут удалены.
blockquote>Я не совсем понимаю эту часть, но в вашем коде должны быть хорошие предложения try / finally, чтобы убедиться, что файлы закрываются надлежащим образом после завершения JVM. Если JVM жестко уничтожена, файл может быть открыт, но еще не записан (в зависимости от времени). В этом случае я бы порекомендовал вам записать во временный файл и переименовать в свой файл свойств, который является атомарным. Тогда вы можете пропустить обновление, если JVM уничтожена, но файл никогда не будет перезаписан и будет пустым.
Если я удалю статические и синхронизированные модификаторы из setAndReplace () и вызову setAndReplace () 5000 раз, старые данные все еще сохранятся (почему?)
blockquote>Понятия не имею. Зависит от условий гонки. Может, тебе просто везет.
Когда я пытаюсь изменить файл props с помощью ExecutorService (иногда я получаю доступ к setAndReplacePropValue () через ExecutorService в моей программе), содержимое файла сохраняется до тех пор, пока не будет задержки после FileOutputStream. Если я добавлю задержку, и задержка будет> значением «тайм-аута», установленным в future.get () (так, чтобы генерировалось прерванное исключение), данные НЕ сохраняются. Это остается верным, даже если я добавлю статические + синхронизированные ключевые слова в метод.
blockquote>Я не могу ответить на этот вопрос, не увидев конкретный код.
Это было бы хорошей идеей, если бы у вас был фиксированный пул потоков с 1 потоком, тогда каждый из потоков, которые хотят обновить значение, просто отправил бы объект поля / значения в пул потоков. Это примерно то, о чем говорил @ Hovercraft-Full-Of-Eels.
Надеюсь, это поможет.