Java и темы: очень странное поведение - PullRequest
0 голосов
/ 21 апреля 2010
        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 ]

9 голосов
/ 21 апреля 2010

Это почти наверняка не проблема с многопоточностью.Я почти уверен, что проблема в классе вашей команды.Вероятно, это неправильно реализует hashCode() / equals().Просмотрите javadoc для этих двух методов и примените их соответствующим образом.

1 голос
/ 21 апреля 2010

Можете ли вы дать подробную информацию о классах Team и Match?Они реализуют equals() и hashCode()?

Так как Team и Match являются вашими собственными классами, вы должны указать java, как они должны соответствовать (решить, равны ли они равно )

сделать это, используя equals() и hashCode().Смотрите также эту статью .

0 голосов
/ 21 апреля 2010

Если вы правильно внедрили equals() и hashCode() , ваш метод мне подходит.

Большой вопрос: откуда взялись teams и matches и как они заполнены?

Если teams и matches изменены разными потоками без синхронизации на одном и том же мониторе, вы можете получить условия гонки там.

Попробуйте синхронизировать методы, которые меняются matches и teams.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...