我需要了解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(大概)不能修改其他玩家的列表。

10-04 17:30