我需要知道使用for java中的方法的用法。请参阅下面的代码一次。
代码:
public void upDateAllUsersStatus(UserDetails userDetails)
{
for(Player p : userDetails.getPlayersList())
{
if(p != null)
{
String userId = p.getUserId();
upDateUserStatus(userId );
}
}
}
public synchronized void upDateUserStatus(String name)
{
//here update status of user in db.
}
上面的代码使用synchronized
用于method.is是否有可能使用上面的upDateUserStatus()获取 java.util.ConcurrentModificationException ?
您能否告诉我上述方法同步使用的用途是什么?。
先谢谢。
答案 0 :(得分:4)
如果upDateUserStatus
修改了存储在其userDetails
对象中的播放器列表,upDateAllUsersStatus
中循环的下一次迭代可能会抛出ConcurrentModificationException
,因为播放器列表已被修改(upDateUserStatus
)在迭代时(upDateAllUsersStatus
)。 synchronized
关键字没有帮助:它可以防止不同线程中的并发执行,但它不会阻止单个线程在同一个线程迭代时修改列表。
你的代码看起来很奇怪,我怀疑它有其他问题:你正在迭代存储在userDetails
中的玩家列表,但你实际上并没有做任何东西单个Player
个对象。您只需在同一个upDateUserStatus
对象上多次调用userDetails
即可。您是否打算upDateUserStatus
采用Player
参数而不是UserDetails
?如果是这样,那应该是安全的,因为个人Player
(可能)不能修改其他玩家的名单。