2015-07-04 67 views
0

我有一個列表公司對象。在java中正確同步使用

每個對象有幾個屬性,它們在對象初始化後永遠不會改變。其中一個propeties是一個列表,持有用戶隨着時間的推移可能會增加或減少的對象。

我想每個事務所對象知道有多少用戶對象了。

所以我的問題是我應該做這樣的

List<Firm> firmsList = getFirmsList(); 

for(int i=0; i<firmsList.size(); i++) 
{ 
    Firm firm = firmsList.get(i); 
    synchronized(firm) 
    { 
     int usersCount = firm.getUsers().size(); 
    } 
} 

,或者我應該也同步用戶對象? (目前用戶對象的列表僅在事務所對象訪問)

回答

1

你說Firm是不變的(它的屬性會永遠對象的初始化之後更改)。如果是這種情況,那麼你根本不需要同步。

+0

是的,但企業內部的列表可能會增長或縮小:) –

+0

比循環外的列表同步 – Antoniossss

+0

@JoroSeksa但你說它的屬性永遠不會改變初始化後。所以,那不是真的 - 如果發生這種情況,那麼你的班級'Firm'是**不是**不可變的。 – Jesper

0

添加一個方便的方法像Firm#getUserSize()或返回一個不可修改的列表java.util.Collections.unmodifiableList(List<? extends T>)成爲不變Firm

取決於Firm#getUsers()左右的工作代碼可能會返回同步的Collection