如果这里的目标是确保在将List序列化并写入文件时,不会对其进行任何更改,那么哪种方法可以做得更好?
private void save() throws IOException {
FileUtils.deleteQuietly(f);
synchronized (list_of_important_data) {
FileManipulationUtils.writeObject(list_of_important_stuff, MY_FILE);
}
}
private void synchronized save() throws IOException {
FileUtils.deleteQuietly(f);
FileManipulationUtils.writeObject(list_of_important_stuff, MY_FILE);
}
为了描述的目的,他们是否都做同样的事情?一个比另一个好吗?
答案 0 :(得分:1)
他们根本不做同样的事情。
第一个在列表上同步;你调用save()的对象上的第二个。当它们在不同的对象上同步时,它们可以抵御不同的并发竞争。
第一个保护列表在保存时不会发生突变,前提是所有突变功能/访问同样都是同步的。
第二个防止save()与其自身同时执行,或者(更重要的是)在已保存对象上同步的任何其他方法。
询问哪一个比另一个更好是不明智的。他们甚至没有远程做同样的事情,因此无法远程比较。哪一个是最好的将取决于你想要通过首先同步实现什么。
鉴于您的问题存在混淆,我怀疑答案可能是“非上述”,实际上您需要重新考虑并发设计。为此,我们需要查看更多代码,并更好地了解您要实现的目标。
答案 1 :(得分:0)
private void synchronized save() throws IOException {
FileUtils.deleteQuietly(f);
FileManipulationUtils.writeObject(list_of_important_stuff, MY_FILE);
}
与
相同 private void save() throws IOException {
synchronized(this){
FileUtils.deleteQuietly(f);
FileManipulationUtils.writeObject(list_of_important_stuff, MY_FILE);
}
}
选择锁定较短的