2016-04-08 6 views
1
  1. これは私がコードのHashMapに関するトピックを読んでいると、関連する質問/回答に

を見つけることができませんマルチスレッド Javaハッシュマップの重複するエントリを説明するには?

  • の下にある:

    private Map<String, String> eventsForThisCategory; 
        ... 
        Map<String, String> getEventsForThisCategory() { 
         if (eventsForThisCategory == null) { 
          Collection<INotificationEventsObj> notificationEvents = notificationEventsIndex.getCategoryNotificationEvents(getCategoryId()); 
          eventsForThisCategory = new HashMap<String, String>(); 
          for(INotificationEventsObj notificationEvent : notificationEvents) { 
           eventsForThisCategory.put(notificationEvent.getNotificationEventID(), notificationEvent.getNotificationEventName()); 
          } 
          logger.debug("eventsForThisCategory is {}", eventsForThisCategory); 
         } 
         return eventsForThisCategory; 
        } 
    

    出力:

    app_debug.9.log.gz:2014年4月7日13:47:06,661デバッグ[WirePushNotificationSyncHandler :: WirePushNot ification.Worker-1] - eventsForThisCategoryは、それが可能であるどのように{FX_WIRE_DATA =主要経済データ、ALL_FX_WIRE =すべて、ALL_FX_WIREは=すべて、FX_WIRE_HEADLINES =クリティカル見出し}

    のですか?

  • +0

    [重複したキーをHashMapに入れた場合どうなるのですか?](http://stackoverflow.com/questions/1669885/what-happens-when-a-duplicate-key-is-put-into -a-hashmap) –

    +0

    まあ、できません。少なくともHashMap ではなく。コードにはどのような並行性がありますか? 2つの 'ALL_FX_WIRE'キーの間で異なる空白がありますか? – Kayaman

    +0

    @Kayamanマルチスレッドです。 2つのキーが異なる空白はありません。あなたが見ることができるように、それは地図を印刷し、それは文字列の自動トリムを行うとは思わない – Volodia

    答えて

    1

    私はあなたのマップは、同時に2つの同じキーを持っていないことをかなり確信しています。あなたが見ているのは、それを繰り返しながらマップを修正する効果です(toString())。 2番目の "ALL_FX_WIRE"が書き込まれると、最初のマップはマップに存在しなくなります。

    すでにHashMapはスレッドセーフではありません。 eventsForThisCategory.toString()が実行されている間にPlus eventsForThisCategoryが別のスレッドによって変更されることがあります。だからこれは期待されています。

    eventsForThisCategoryが同時に複数のスレッドによって変更されていないことを確認してください(またはConcurrentHashMapに切り替え)、およびtoString()は(あなたがデバッグ出力を作成するときに、それが呼ばれる)が実行されている間、それが修正されていないことを確認してください。

    +0

    ああ、私は完全にtoStringもマップ上の反復であることを忘れていました。答えはありがとう、 – Volodia

    0

    ハッシュマップはスレッドではありません。マルチスレッドでは安全です。 あなたはインスタンス あなたをHashMapのラップやConcurrentHashMapを使用するCollections.synchronizedMap()を使用しようとすることができ、おそらくより良い

    +0

    私が期待していた答えではありません。あなたはそれがどうなるか説明しませんでした。 – Volodia

    関連する問題