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

Der*_*erk 0 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()));
                }
        }
Run Code Online (Sandbox Code Playgroud)

这是我的代码.匹配包含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
Run Code Online (Sandbox Code Playgroud)

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

Sea*_*wen 9

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