简体   繁体   English

在Java中同步使用for方法?

[英]Synchronized using for Methods in Java?

I need to know about the usage of Synchronized using for methods in java .Please see the below code once. 我需要了解Java中for方法Synchronized using的用法。请一次查看以下代码。

Code : 代码:

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.
}

The above code used synchronized for method.is there any possibility of getting java.util.ConcurrentModificationException using synchronized above upDateUserStatus()? 上面的代码中使用synchronized对method.is那里得到java.util.ConcurrentModificationException的任何可能性利用上述upDateUserStatus同步()?

Can you please suggest me what is the use of synchronized using for above method?. 您能否建议我上述方法的“同步使用”有什么用?

Thanks in Advance. 提前致谢。

If upDateUserStatus modifies the list of players stored in its userDetails object, the next iteration of the loop in upDateAllUsersStatus may throw a ConcurrentModificationException because the player list was modified (by upDateUserStatus ) while it's being iterated (by upDateAllUsersStatus ). 如果upDateUserStatus修改了存储在其userDetails对象中的播放器列表,则upDateAllUsersStatus循环的下一次迭代可能会引发ConcurrentModificationException因为播放器列表是在被迭代( upDateUserStatus )时被修改的(通过upDateAllUsersStatus )。 The synchronized keyword doesn't help: that protects against concurrent execution in different threads, but it doesn't prevent an individual thread from modifying a list while that same thread is iterating it. synchronized关键字无济于事:它可以防止在不同线程中并发执行,但是它不能防止单个线程在同一线程对其进行迭代时修改列表。

Your code looks strange, though, and I suspect it has other problems: you're iterating the list of players stored in userDetails , but you don't actually do anything with the individual Player objects. 但是,您的代码看起来很奇怪,我怀疑它还有其他问题:您正在迭代存储在userDetails中的播放器列表,但实际上对单个Player对象没有任何作用。 You just call upDateUserStatus multiple times on the same userDetails object. 您只需在同一userDetails对象上多次调用upDateUserStatus Did you intend for upDateUserStatus to take a Player argument instead of a UserDetails ? 您是否打算让upDateUserStatus接受Player参数而不是UserDetails If so, that should be safe, since an individual Player (presumably) can't modify the list of other players. 如果是这样,那应该是安全的,因为单个Player (大概)无法修改其他玩家的列表。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM