2015-07-04 22 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