[英]Synchronizing on an object, clarification needed
如果此处的目标是确保在序列化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);
}
两者出于上述目的都做相同的事情吗? 一个比另一个好吗?
他们根本不会做同一件事。
第一个在列表上同步; 第二个是您调用了save()的对象。 当它们在不同的对象上同步时,它们会抵御不同的并发竞争。
第一个可以防止列表在保存时发生突变,前提是所有突变功能/访问同样都已同步。
第二种方法可以防止save()与自身(或更重要的是)在已保存对象上同步的任何其他方法同时执行。
问哪个比另一个更好是不明智的。 他们甚至不会远程执行相同的操作,因此无法远程比较。 哪个最好,将取决于您首先要通过同步来实现的目标。
考虑到您的问题的困惑,我怀疑答案很可能是“无与伦比”,实际上,您需要重新考虑并发设计。 为了解决这个问题,我们需要查看更多代码,并对您要实现的目标有更好的了解。
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);
}
}
选择一个较短的锁
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.