java和线程:非常奇怪的行为

时间:2010-04-21 10:59:34

标签: java thread-safety

        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

这是在线程环境中,但是方法是同步的,所以我认为这不会产生问题?我对这种方法也有一个简单的单元测试,效果很好。

3 个答案:

答案 0 :(得分:9)

这几乎肯定不是一个线程问题。我几乎可以肯定问题出在你的Team类中。它可能没有以正确的方式实施hashCode() / equals()。查看这两种方法的javadoc并相应地实现它们。

答案 1 :(得分:1)

您能否提供TeamMatch课程的详细信息? 他们是在实施equals()hashCode()吗?

由于Team and Match是你自己的类,你必须告诉java它应该如何匹配(决定它们是否相等

您可以使用equals()hashCode()执行此操作。另请参阅this article

答案 2 :(得分:0)

假设您已实施equals()hashCode() correctly,您的方法对我来说很好。

最大的问题是:teamsmatches来自哪里以及它们是如何填充的?

如果teamsmatches在同一台显示器上没有同步而被不同的线程更改,那么您可能会遇到竞争条件。

尝试同步正在更改matchesteams的方法。