[英]java and threads: very strange behaviour
private synchronized Map<Team, StandingRow> calculateStanding() {
System.out.println("Calculate standing for group " + getName());
Map<Team, StandingRow> standing = new LinkedHashMap<Team, StandingRow>();
for (Team team : teams) {
standing.put(team, new StandingRow(team));
}
StandingRow homeTeamRow, awayTeamRow;
for (Match match : matches.values()) {
homeTeamRow = standing.get(match.getHomeTeam());
awayTeamRow = standing.get(match.getAwayTeam());
System.out.println("Contains key for " + match.getHomeTeam() + ": " + standing.containsKey(match.getHomeTeam()));
System.out.println("Contains key for " + match.getAwayTeam() + ": " + standing.containsKey(match.getAwayTeam()));
}
}
这是我的代码。 比赛包含6个元素,但是问题是两次比赛之后,站立地图中再也找不到钥匙。
输出例如
Contains key for Zuid-Afrika: true
Contains key for Mexico: true
Contains key for Uruguay: true
Contains key for Frankrijk: true
Contains key for Zuid-Afrika: false
Contains key for Uruguay: false
Contains key for Frankrijk: false
Contains key for Mexico: false
Contains key for Mexico: false
Contains key for Uruguay: false
Contains key for Frankrijk: false
Contains key for Zuid-Afrika: false
这是在线程环境中,但是方法是同步的,所以我认为这样不会带来问题? 我对此方法也有一个简单的单元测试,效果很好。
这几乎肯定不是线程问题。 我几乎可以肯定,问题出在您的团队班上。 它可能没有以正确的方式实现hashCode()
/ equals()
。 查看这两个方法的javadoc并相应地实现它们。
您能否提供Team
和Match
类别的详细信息? 他们在实现equals()
和hashCode()
吗?
由于Team和Match是您自己的类,因此您必须告诉java它应该如何匹配 (确定它们是否相等 )。
您可以使用equals()
和hashCode()
。 另请参阅本文 。
假设您正确实现了equals()
和hashCode()
,那么您的方法对我来说就很好。
最大的问题是: teams
和matches
从何而来?如何填补?
如果teams
和matches
由不同的线程更改而没有在同一监视器上同步,那么您可以在那里获得比赛条件。
尝试同步更改matches
和teams
的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.