繁体   English   中英

同步对象,需要澄清

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM