В чем разница между Preferences.flush() и Preferences.sync()?

Из Javadoc (flush()):

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

Реализации могут в любое время сбрасывать изменения в постоянное хранилище. Им не нужно ждать вызова этого метода.

Когда сброс происходит на вновь созданном узле, он становится постоянным, как и любые предки (и потомки), которые еще не стали постоянными. Однако обратите внимание, что любые изменения значений предпочтений в предках не гарантируются, что они будут постоянными.

Если этот метод вызывается на узле, который был удален с помощью метода removeNode(), flushSpi() вызывается на этом узле, но не на других.

sync() :

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

Если посмотреть на реализации java.util.prefs.FileSystemPreferences и java.util.prefs.WindowsPreferences, flush() просто вызывает sync(), и все.

При работе с другими реализациями java.util.prefs (если они соответствуют спецификации):

  • Каковы мои шансы потерять несохраненные данные (например, в случае отключения электроэнергии или аварийного завершения работы JVM), если я просто flush(), но не sync()?
  • Кроме того, правильно ли я понимаю, что sync() гарантирует, что изменения станут видимыми для других JVM, а flush() - нет?
1
Bass 25 Сен 2018 в 12:50

2 ответа

Лучший ответ

По умолчанию все методы изменения предпочтений являются асинхронными и гарантируют конечную согласованность.

flush() используется для синхронного выполнения модификаций, т.е. путем блокировки выполнения.

sync() используется для фиксации всех ожидающих изменений, которые должны были произойти асинхронно. Другими словами, sync () заблокирует выполнение и заставит состояние согласоваться перед продолжением.

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

1
Arpit Sharma 11 Окт 2018 в 06:18
flush()

Flush в основном выполняет операцию записи любых изменений узла предпочтений в резервное хранилище, включая данные на всех дочерних узлах.

sync()

Это гарантирует, что текущая версия узла предпочтений в памяти совпадает с сохраненной версией и в основном Sync() блокирует выполнение, поэтому используйте метод flush(), чтобы избежать несохраненных данных.

1
DHARMENDRA SINGH 9 Окт 2018 в 11:45