我刚刚完成了我正在参加的分布式编程类(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,使该字段成为最终字段,并删除同步,直到您证明确实有必要。成本微不足道,“显然安全正确”的解决方案几乎永远不会太慢。

您提到这是一个类项目-专注于使代码正常工作。并发足够困难,而又不会创造出其他必须克服的障碍。

10-07 22:07