3

以下のリンク を確認しました String オブジェクトの同期に問題がありますか? および http://illegalargumentexception.blogspot.com/2008/04/java-synchronizing-on-transient-id.html

今私の質問:

  1. ユーザーIDといくつかのプロパティのリストが保持されているマップがあります
  2. 新しいユーザー ID に遭遇したら、マップにエントリを作成します。
  3. ユーザー ID が既に存在する場合は、いくつかのプロパティを値に追加します。

マップ全体で同期する代わりに、ユーザー ID で同期しようとしたため、ランダムな動作が発生しました。intern() を使用すると、2 番目のリンクのアプローチも機能します。

質問:

  1. 2番目のアプローチでは、キーを取得するときにマップ全体をロックしています
  2. ユーザーIDのみに基づいてマップアクセスが同期されるように、他の同期方法はありますか
  3. これを行う最良の方法は何ですか?
4

2 に答える 2

3

最良の方法は、java.util.concurrent パッケージのConcurrentHashMapを使用することです。このクラスには、必要なものがすべて組み込まれています。最初からやり直す必要はありません。

注: Thilo は正しい: ConcurrentHashMap の特別なスレッド セーフ バージョンの put: putIfAbsent()を使用する必要があります。

于 2011-08-26T09:48:33.500 に答える
2

を使用しConcurrentMap<String, UserProperties>ます。

適切なものを取得するコードは次のUserPropertiesようになります。

public UserProperties getProperties(String user) {
    UserProperties newProperties = new UserProperties();
    UserProperties alreadyStoredProperties = map.putIfAbsent(user, newProperties);
    if (alreadyStoredProperties != null) {
        return alreadyStoredProperties;
    }
    else {
        return newProperties;
    }
}
于 2011-08-26T09:53:13.913 に答える