0

如果这里的目标是确保在 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);
}

他们是否都出于所描述的目的做同样的事情?一个比另一个好吗?

4

2 回答 2

1

他们根本不做同样的事情。

第一个同步列表;您调用 save() 的对象上的第二个。当它们在不同的对象上同步时,它们可以抵御不同的并发竞争。

第一个防止列表在保存时发生突变,前提是所有突变功能/访问同样同步。

第二个防止 save() 与自身同时执行,或者(更重要的是)在已保存对象上同步的任何其他方法。

问哪个比另一个更好是不明智的。他们甚至没有远程做同样的事情,因此没有远程可比性。哪个是最好的将取决于您首先要通过同步来实现什么。

鉴于您的问题令人困惑,我怀疑答案很可能是“以上都不是”,实际上您需要重新考虑您的并发设计。为了帮助解决这个问题,我们需要查看更多您的代码,并更好地了解您想要实现的目标。

于 2013-01-15T03:50:02.430 回答
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);
        }
    }

选择一个更短的锁

于 2013-01-15T03:47:32.327 回答