繁体   English   中英

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

[英]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并相应地实现它们。

您能否提供TeamMatch类别的详细信息? 他们在实现equals()hashCode()吗?

由于Team和Match是您自己的类,因此您必须告诉java它应该如何匹配 (确定它们是否相等 )。

您可以使用equals()hashCode() 另请参阅本文

假设您正确实现了equals()hashCode() ,那么您的方法对我来说就很好。

最大的问题是: teamsmatches从何而来?如何填补?

如果teamsmatches由不同的线程更改而没有在同一监视器上同步,那么您可以在那里获得比赛条件。

尝试同步更改matchesteams的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM