【发布时间】:2013-01-13 17:57:47
【问题描述】:
我刚刚为我正在参加的分布式编程课程开发了一个 Java Web 服务服务器。其中一项要求是保证我们项目的多线程安全,因此我决定使用 ConcurrentHashMap 对象来存储我的数据。 最后,我留下了一个关于这个 sn-p 代码的问题:
public List<THost> getHList() throws ClusterUnavailable_Exception{
logger.entering(logger.getName(), "getHList");
if(hMap==null){
synchronized(this){
if(hMap==null){
hMap=createHMap();
}
}
}
if(hMap==null){
ClusterUnavailable cu = new ClusterUnavailable();
cu.setMessage("Data unavailable.");
ClusterUnavailable_Exception exc = new ClusterUnavailable_Exception("Data unavailable.", new ClusterUnavailable());
throw exc;
}
else{
List<THost> hList = new ArrayList<THost>(hMap.values());
logger.info("Returning list of hosts. Number of hosts returned = "+hList.size());
logger.exiting(logger.getName(), "getHList");
return hList;
}
}
在创建concurrenthashmap对象本身时是否必须使用synchronized语句,以保证服务在多线程环境中不会出现任何不可预知的行为?
【问题讨论】:
-
为什么要等到现在才构造
hMap?为什么不在构建时初始化它? -
这个问题适用于创建任何对象,而不仅仅是 ConcurrentHashMaps。
-
这是我在同步数组列表的构造时使用的模式。但是,在这种特殊情况下,我希望在客户端请求我的 Web 服务提供的操作之一时创建 hMap。事实上,我实际上在内部 if 中调用
hMap=createHMap();并在内部进行一些解组。 -
虽然在某些情况下您可能希望延迟施工,但这不是其中之一。创建一个空的 HashMap 几乎不使用 CPU 时间或内存。我非常同意路易斯的观点,只需在施工时完成并最终完成。如果您正在构建某个远程服务器的很少使用的文件目录树,那么延迟...
标签: java multithreading web-services synchronized concurrenthashmap