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