2014-11-06 40 views
1

我需要知道的使用情况同步使用java中的方法。请参阅下面的代码一次。在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. 
} 

上面的代码中使用​​为method.is那里获得的任何可能性java.util.ConcurrentModificationException上述upDateUserStatus使用同步的()?

你能否给我建议什么是同步使用上述方法?

在此先感谢。

+0

'if(p!= null)'看起来应该被删除的一些不必要的迷信编码。如果列表中存在空值,请修复将空值放入列表中的代码。 – Boann 2014-11-07 15:05:55

回答

4

如果upDateUserStatus修改玩家存储在其userDetails对象列表,循环中upDateAllUsersStatus下一次迭代可以抛出ConcurrentModificationException因为播放列表被修改(由upDateUserStatus),而它正在迭代(由upDateAllUsersStatus)。​​关键字不起作用:它可以防止不同线程中的并发执行,但它不会阻止单个线程修改列表,而同一线程正在迭代它。

您的代码看起来很奇怪,不过,我怀疑它有其他的问题:你是迭代的球员存储在userDetails的名单,但你实际上并不任何与个人Player对象。您只需在同一个userDetails对象上多次呼叫upDateUserStatus。你是否打算让upDateUserStatus采取Player而不是UserDetails?如果是这样,那应该是安全的,因为个人Player(推测)不能修改其他玩家的名单。

+0

是的,请检查一次我的代码,并请再次提醒我。@ Wyzard – user2344293 2014-11-06 09:43:18