К сожалению, очень сложно предоставить отзыв о вашем коде без тонны дополнительной информации, но, надеюсь, мои комментарии будут полезны.
В общем случае чтение и запись нескольких потоков из одного и того же файладействительно плохая идея.Я не могу согласиться с тем, что @ Hovercraft-Full-Of-Eels рекомендует, чтобы у вас была тема 1 для чтения / записи, а другие темы просто добавляли обновления в общую BlockingQueue
.
Но здесь говорится о некоторых комментариях.
Если setAndReplace () объявлен как статический + синхронизированный, исходные данные реквизита сохраняются.
Правильно, это останавливаетсяужасное состояние гонки в вашем коде, когда 2 потока могут пытаться записать в выходной файл одновременно.Или может быть, что 1 поток начинает запись , а другой поток читает пустой файл, что приводит к потере данных.
Если JVM уничтожена / прервана (после вызова FileOutputStream)тогда предыдущие данные будут удалены.
Я не совсем понимаю эту часть, но у вашего кода должны быть хорошие предложения try / finally, чтобы убедиться, что файлы закрываются надлежащим образом, когда JVM завершает работу.Если JVM жестко уничтожена, файл может быть открыт, но еще не записан (в зависимости от времени).В этом случае я бы порекомендовал вам записать во временный файл и переименовать в файл свойств, который является атомарным.Тогда вы можете пропустить обновление, если JVM уничтожена, но файл никогда не будет перезаписан и будет пустым.
Если я удаляю как статические, так и синхронизированные модификаторы из setAndReplace () и вызываю setAndReplace () 5000 разстарые данные все еще сохраняются (почему?)
Понятия не имею.Зависит от условий гонки.Возможно, вам просто повезло.
Когда я пытаюсь изменить файл props с помощью ExecutorService (я иногда обращаюсь к setAndReplacePropValue () через ExecutorService в моей программе), содержимое файла сохраняется до тех пор, пока после FileOutputStream не будет задержки,Если я добавлю задержку, и задержка будет> значением «тайм-аута», установленным в future.get () (так, чтобы генерировалось прерванное исключение), данные НЕ сохраняются.Это остается верным, даже если я добавлю статические + синхронизированные ключевые слова к методу.
Я не могу ответить на этот вопрос, не увидев определенный код.
На самом деле это было бы хорошей идеей, если выимел фиксированный пул потоков с 1 потоком, тогда каждый из потоков, которые хотят обновить значение, просто отправлял бы объект поля / значения в пул потоков.Это примерно то, о чем говорил @ Hovercraft-Full-Of-Eels.
Надеюсь, это поможет.