我需要了解Java中用于方法的Synchronized using的用法。请一次查看以下代码。
代码:
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。是否有可能使用upDateUserStatus()之上的同步来获取java.util.ConcurrentModificationException?您能否建议我上述方法的“同步使用”有什么用?
提前致谢。
最佳答案
如果upDateUserStatus
修改了存储在其userDetails
对象中的播放器列表,则upDateAllUsersStatus
中循环的下一次迭代可能会抛出ConcurrentModificationException
,因为播放器列表在迭代时(由upDateUserStatus
修改)(通过upDateAllUsersStatus
)。 synchronized
关键字无济于事:它可以防止在不同线程中并发执行,但是它不能防止单个线程在同一线程对其进行迭代时修改列表。
但是,您的代码看起来很奇怪,我怀疑它还有其他问题:您正在迭代存储在userDetails
中的播放器列表,但实际上对单个Player
对象没有任何作用。您只需在同一upDateUserStatus
对象上多次调用userDetails
。您是否打算让upDateUserStatus
接受Player
参数而不是UserDetails
?如果是这样,那应该是安全的,因为单个Player
(大概)不能修改其他玩家的列表。