gpt4 book ai didi

Java:在创建 ConcurrentHashMap 对象时使用 synchronized(this) 是一种可取的做法吗?

转载 作者:行者123 更新时间:2023-11-29 09:41:21 26 4
gpt4 key购买 nike

我刚刚为我正在参加的分布式编程类(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;
}
}

是否必须在创建 concurrenthashmap 对象本身时使用 synchronized 语句,以保证服务在多线程环境中不会有任何不可预测的行为?

最佳答案

不客气。急切地初始化 Map,使该字段成为最终字段,并停止同步,直到您证明它确实是必要的。成本微乎其微,而且“显然安全且正确”的解决方案几乎永远不会太慢。

您提到这是一个类(class)项目——专注于让代码正常工作。如果不发明额外的障碍,并发性就已经够难了,您必须克服这些障碍。

关于Java:在创建 ConcurrentHashMap 对象时使用 synchronized(this) 是一种可取的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14595188/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com