私はウェブアプリケーションを持っています。tomcat
呼び出しを処理する複数のスレッドで実行されていServlet
ます。
User
クラス、クラスAccount
、および 1AccountContext` クラスがあります。
Accounts
複数持つことができますUsers
。
ごとにのインスタンスを 1 つだけAccountContext
メモリに保持する必要がありますAccount
。
ユーザーがサーブレット経由でログイン呼び出しを行った場合: がAccountContext
存在する場合は、それを返します。それ以外の場合は、初期化します。
以下は、コンテキストを初期化するために書いたコードです。このコードは、スレッドセーフでありながら、私が望むことを行うように見えますか?
ACCOUNT_CONTEXT_MAP
ですConcurrentHashMap
。
public static AccountContext getAccountContext(Account account) {
AccountContext accountContext = ACCOUNT_CONTEXT_MAP.get(account);
if(accountContext == null){
synchronized(account){
if(ACCOUNT_CONTEXT_MAP.get(account) == null)
accountContext = new AccountContext(account);
//Creating the AccountContext is expensive,
//i'd like it if it was only done once.
ACCOUNT_CONTEXT_MAP.put(account,accountContext);
}else{
accountContext = ACCOUNT_CONTEXT_MAP.get(account);
}
}
}
return accountContext;
}