2011-08-09 45 views
2

我有模型。這實際上是一個對象的ArrayList。 而且我也有處理它的方法。如remove(),find(),getAll(),create(),add(),loadFromFile()和storeInFile()。模型的Java同步

該模型由不同的客戶使用。他們都參考了這個資源。讓他們在沒有同步的情況下更改模型是否好?他們將能夠在同一時刻調用特定的方法。

我該如何進行同步?我是否需要同步方法或集合?

回答

-1

從ArrayList更改爲Vector應該就足夠了。向量是線程安全的實現者java.util.List。如果不是最快的話,這似乎是使線程安全的最簡單方法。

+2

這是最快的更改,但沒有明確指示同步。程序員承擔額外的負擔:不要因爲隱式使用同步而改變正在使用的集合。使用synchronized關鍵字在模型API的級別上進行同步會更好。 – Atreys

+0

'Vector'被認爲是過時的,請參閱http://stackoverflow.com/questions/1386275/why-java-vector-class-is-considered-obsolete-or-deprecated – Qwerky

+1

爲什麼使用Vector類幾乎已經過時而不是要麼在列表的包含對象中同步訪問,要麼使用Collection中較新推薦的類之一,例如包裝在Collections.synchronizedList中的ArrayList?後者在[ArrayList API](http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html)中有詳細說明。 –

2

這取決於 - 如果你的方法做了一些更長的邏輯之前,例如添加新的對象到集合中,我會建議在方法級別上同步操作。當然,它比將ArrayList更改爲線程安全的集合要慢,但如果您之前執行了一些操作,則它可以確保將數據放入集合中的時間不會過時。

當然在另一種情況下,你內部集合的同步是更好的解決方案。

2

讓他們改變模型沒有同步是好的嗎?

NO。如果它是共享資源,則客戶端將具有不一致的視圖。那簡直是不可接受

我該如何進行同步?

使用​​關鍵字。

我必須同步方法或集合嗎?

我建議你同步集合,而不是方法。例如,

public void add(Object o){ 
    synchronized(foo){ 
     foo.add(o); 
    } 
} 

其中foo是你的收藏。


欲瞭解更多信息,請參見:

0

你需要考慮在模型中的每個方法,並考慮多線程調用的方法的後果同一時間,以及後果是什麼。如果任何後果不好,請使用同步。如果不知道模型背後的邏輯,沒有人可以給你正確的答案。