同步对象,需要澄清

时间:2013-01-15 03:41:35

标签: java synchronization

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

为了描述的目的,他们是否都做同样的事情?一个比另一个好吗?

2 个答案:

答案 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);
        }
    }

选择锁定较短的