我刚刚完成了我正在参加的分布式编程类(class)的Java Web服务服务器的开发。要求之一是保证我们项目的多线程安全,因此我决定使用ConcurrentHashMap对象存储我的数据。
最后,我对这个代码片段有一个疑问:
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;
}
}
为了确保服务在多线程环境中不会有任何不可预测的行为,创建并发哈希图对象本身时是否必须使用synced语句?
最佳答案
不要打扰认真初始化Map
,使该字段成为最终字段,并删除同步,直到您证明确实有必要。成本微不足道,“显然安全正确”的解决方案几乎永远不会太慢。
您提到这是一个类项目-专注于使代码正常工作。并发足够困难,而又不会创造出其他必须克服的障碍。