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
这是在线程环境中,但是方法是同步的,所以我认为这不会产生问题?我对这种方法也有一个简单的单元测试,效果很好。
答案 0 :(得分:9)
这几乎肯定不是一个线程问题。我几乎可以肯定问题出在你的Team类中。它可能没有以正确的方式实施hashCode()
/ equals()
。查看这两种方法的javadoc并相应地实现它们。
答案 1 :(得分:1)
您能否提供Team
和Match
课程的详细信息?
他们是在实施equals()
和hashCode()
吗?
由于Team and Match是你自己的类,你必须告诉java它应该如何匹配(决定它们是否相等)
您可以使用equals()
和hashCode()
执行此操作。另请参阅this article。
答案 2 :(得分:0)
假设您已实施equals()
和hashCode()
correctly,您的方法对我来说很好。
最大的问题是:teams
和matches
来自哪里以及它们是如何填充的?
如果teams
和matches
在同一台显示器上没有同步而被不同的线程更改,那么您可能会遇到竞争条件。
尝试同步正在更改matches
和teams
的方法。