2011-09-17 7 views
2

サーブレット内のオブジェクトをマップする必要があります。 ConcurrentHashMapは信頼できる選択ですか?すべての要求は、要求されたオブジェクトをマップから取得するのか、それとも失敗するのでしょうか?ConcurrentHashMapはServlet内で使用する信頼できる選択肢ですか?

public class MyServlet extends HttpServlet { 

    private Map<String, Object> map = new ConcurrentHashMap<String, Object>(); 

    public void doGet(HttpServletRequest request, HttpServletResponse response) { 
     // use map 
     map.get("myObjectName"); 
    } 

} 

答えて

5
private static final ImmutableMap<String, Object> MY_MAP = ImmutableMap.of(
     "asdf", myObj1, 
     "qwerty", myObj2 
); 

ConcurrentHashMapの目的はをロックせず検索を可能にすることです。これは、多くの読み込みと非常に少ない書き込みを持つマルチスレッドプログラムに適しています。

あなたは

オブジェクトは、サーブレットのinitの後modifidedされていません書きました。 - 初心者

サーブレットの初期化後にマップが変更されないということを意味する場合は、ConcurrentHashMapはまったく必要ありません。あなたは普通の古いHashMapを使うことができます。 Collections.unmodifiableMapを使用して、変更不可能なマップに変換する方が良いでしょう。

0

答えは、残りのメソッドがマップを変更するかどうかによって異なります。

マップへの変更が書かれているようにACIDになるという保証はありません。

通常、このような共有状態をサーブレットに持つことは悪い考えです。それらはHTTPリクエストを処理するためのものです。その機能を、その作業を行うサービスに移す方がよいでしょう。

+0

サーブレットの起動後、オブジェクトは変更されません。 – newbie

4

マップが唯一の起動時に初期化されているので、あなたはグアバのImmutableMapを使用することを検討すべきであるが:

private static final ImmutableMap<String, Object> MY_MAP = ImmutableMap 
     .<String, Object>builder() 
     .put("asdf", myObj1) 
     .put("qwerty", myObj2) 
     .build(); 

Builderbuild()を呼び出すと、マップを返した後、所望の値と事前移入マップするために使用されます。それ以降、スレッドは安全になり、不変です。

はまた、キーと値のペアの限られた数のofファクトリメソッドを使用することができる:

関連する問題