簡體   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