【发布时间】:2013-06-30 23:41:11
【问题描述】:
我有一个网络应用程序。在 tomcat 和多个线程上运行 Servlet 调用。
我有一个 User 类、一个 Account 类和一个 1AccountContext` 类。
Accounts 可以有多个Users。
每个Account 只应在内存中维护一个AccountContext 实例。
当用户通过 servlet 进行登录调用时:如果 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;
}
【问题讨论】:
标签: java thread-safety lazy-initialization