使用Java中的方法同步?

时间:2014-11-06 04:28:38

标签: java

我需要知道使用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

您能否告诉我上述方法同步使用的用途是什么?。

先谢谢。

1 个答案:

答案 0 :(得分:4)

如果upDateUserStatus修改了存储在其userDetails对象中的播放器列表,upDateAllUsersStatus中循环的下一次迭代可能会抛出ConcurrentModificationException,因为播放器列表已被修改(upDateUserStatus)在迭代时(upDateAllUsersStatus)。 synchronized关键字没有帮助:它可以防止不同线程中的并发执行,但它不会阻止单个线程在同一个线程迭代时修改列表。

你的代码看起来很奇怪,我怀疑它有其他问题:你正在迭代存储在userDetails中的玩家列表,但你实际上并没有任何东西单个Player个对象。您只需在同一个upDateUserStatus对象上多次调用userDetails即可。您是否打算upDateUserStatus采用Player参数而不是UserDetails?如果是这样,那应该是安全的,因为个人Player(可能)不能修改其他玩家的名单。