Preferences.flush()和Preferences.sync()有什么区别?

时间:2018-09-25 09:50:27

标签: java io preferences

Preferences.flush()Preferences.sync()有什么区别?

来自 Javadoc flush()):

  

将此首选项节点及其后代的内容中的任何更改强制到持久性存储中。一旦此方法成功返回,就可以安全地假定在方法调用之前对以该节点为根的子树中所做的所有更改都是永久性的。

     

实现可以随时将更改刷新到持久性存储中。他们不需要等待此方法被调用。

     

在新创建的节点上发生刷新时,刷新将被持久化,所有尚未被持久化的祖先(和后代)也将被持久化。但是请注意,祖先的任何首选项值更改都不能保证持久。

     

如果在已使用removeNode()方法删除的节点上调用此方法,则在该节点上调用flushSpi(),而在其他节点上不调用。

sync()

  

确保将来从此首选项节点及其后代中进行读取时,将反映在同步调用之前已提交给持久性存储(从任何VM)的任何更改。作为副作用,将此首选项节点及其后代的内容中的所有更改强制移到持久性存储中,就好像在此节点上调用了flush方法一样。

看看java.util.prefs.FileSystemPreferencesjava.util.prefs.WindowsPreferences的实现,flush()仅调用sync(),就是这样。

在处理其他java.util.prefs实现时(如果它们遵循规范):

  • 如果我只是flush(),而不是sync(),我丢失未保存的数据(例如在断电或JVM异常终止的情况下)的机会是什么?
  • 此外,我的理解是否正确,sync()保证更改对其他JVM可见,而flush()则不可见?

2 个答案:

答案 0 :(得分:1)

默认情况下,所有用于修改首选项的方法都是异步的,并保证最终的一致性。

flush()用于同步执行修改,即通过阻止执行。

sync()用于提交应该异步进行的所有挂起的修改。换句话说,sync()将阻止,并继续执行之前强制状态保持一致。

为避免在异常终止的情况下丢失未保存的数据,应在各处使用flush()。我无法评论这将如何影响您的代码效率。

答案 1 :(得分:1)

flush()

Flush基本上执行对首选项节点到后备存储的任何更改(包括所有子节点上的数据)的写操作。

sync()

它确保内存中当前的首选项节点版本与存储的版本匹配,并且基本上Sync()阻止执行,因此请使用flush()方法来避免未保存的数据。