1
// in a context listener
public void contextInitialized(ServletContextEvent sce) {
        SessionListener.context = sce.getServletContext();
        HashMap<String, String> messages = new HashMap<>();
        context.setAttribute("messages", messages);
}

ここで、さまざまなサーブレットからメッセージ マップにアクセスしたいと考えています。同期についてはどうでしょうか。

つまり、マップに要素を追加したい (そのキーは一意である必要があります) - Java ee API に何らかのメソッドがある場合を除いて (?)

編集:セッションスコープマップへのアクセスの同期にも興味があります

4

1 に答える 1

3

このマップは、複数のスレッドによって共有される非スレッドセーフ オブジェクトです。そのため、マップへのすべてのアクセスを同期する必要があります。さまざまなオプションがあります。

  • マップの各クライアントをマップ自体で同期させる: 非常に壊れやすい
  • Collections.synchronizedMap()または ConcurrentHashMapのようなスレッドセーフなマップを使用します。これにより、マップが一貫性のない状態になることはありませんが、アトミックである必要があるが、マップでいくつかのメソッド呼び出しを伴う操作には、追加の同期が必要になる可能性があります。
  • マップを独自のオブジェクトにカプセル化し、このオブジェクトがマップで実行する必要があるすべての必要な操作を提供することを確認します。もちろん、これらの操作は必要な同期を実行する必要があります。

3 番目の解決策がおそらく最良の解決策です。2 つ目は、マップ上の操作が非常に単純で、マップのメソッドでカバーされている場合は問題ありません。

一意のランダム文字列の生成に関しては、ランダム性のためにUUID (一意性のため) とランダム (または要件に応じて SecureRandom) を組み合わせることができます。

于 2012-10-10T11:32:23.060 に答える