2013-01-15 20 views
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); 
} 

他們是否都爲上述目的做同樣的事情?一個比另一個更好嗎?

+0

我對此不太清楚,但我猜第一個*可能會更有效率,因爲它是同步更短的時間?區別取決於deleteQuietly花費多長時間以及是否需要同步。 –

+0

兩者最終都做同樣的事情嗎?比另一個更受歡迎嗎? – JAM

回答

1

他們不這樣做同樣的事情在所有。

第一個同步在列表上;第二個是你調用save()的對象。當他們在不同的對象上進行同步時,他們會抵禦不同的併發競爭。

如果所有的突變函數/訪問同步同步,第一個函數可以防止列表在保存期間發生突變。

第二種防止save()與其自身同時執行,或者(更重要的是)保存對象上同步的任何其他方法。

問哪個比另一個更好是不明智的。他們甚至不會遠程執行相同的操作,因此無法進行遠程比較。哪一個最好是要首先根據你正在嘗試通過同步來實現的目標。

鑑於您的問題存在混淆,我懷疑答案很可能是'非上述',實際上您需要重新考慮您的併發設計。爲了解決這個問題,我們需要查看更多的代碼,並且更好地瞭解您要實現的目標。

+0

一個很好的答案和解釋。謝謝 – JAM

+0

我想提出一個非同步問題。 'deleteQuietly(f)'和MY_FILE之間的關係是什麼?如果我懷疑它們是相關的,那麼刪除和寫入之間的任何失敗都會丟失用戶的數據。 Stewart Smith,其中一名MySQL維護人員在LCA 2007上就此問題和其他IO問題做了演示。我強烈建議您使用以下視頻:http://lca2007.linux.org.au/talk/278.html – Recurse

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

選擇鎖定較短