В чем разница между Preferences.flush () и Preferences.sync ()? - PullRequest
0 голосов
/ 25 сентября 2018

В чем разница между 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() - нет?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018
flush()

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

sync()

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

0 голосов
/ 08 октября 2018

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

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

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

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

...