我有一个Web应用程序。运行在tomcat
和多个线程服务Servlet
调用。Java线程安全延迟初始化
我有一个User
类,Account
类和一个1AccountContext类。可以有多个Users
。
根据Account
,只应在内存中保留AccountContext
的1个实例。
当用户通过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;
}
是的,你说得对。我不能保证它们是同一个Account对象。但我也不想在地图上进行同步,因为我不希望线程在不同的帐户上等待昂贵的AccountContext创建。如果不同帐户的上下文创建并行完成,并且仅在添加到散列映射时才支付同步惩罚,那么我希望这样做。 – golfmonke
@ user2537426我编辑了我的帖子,为您的问题添加了可能的解决方案,yshavit的解决方案也是一个不错的解决方案。 – morgano