为什么ServiceManager.putService需要判断两次serviceMap中的key不

public void putService(Service service) { //第一次判断 if (!serviceMap.containsKey(service.getNamespaceId())) { synchronized (putServiceLock) { //第二次判断 //TODO 为什么在锁后面再判断一次 if (!serviceMap.containsKey(service.getNamespaceId())) { serviceMap.put(service.getNamespaceId(), new ConcurrentHashMap<>(16)); } } } serviceMap.get(service.getNamespaceId()).put(service.getName(), service); } 这段com.alibaba.nacos.naming.core.ServiceManager代码,如果不添加第二次判断会有什么问题。

我的理解,如果没有判断,可能会导致并发线程多次创建new ConcurrentHashMap<>(16),而不会影响serviceMap。 求大佬解疑。

原提问者GitHub用户niuzhm

展开
收起
学习娃 2023-05-22 16:57:38 104 分享 版权
1 条回答
写回答
取消 提交回答
  • 和双重检测的单例模式类似,可以自信搜索并了解一下。

    原回答者GitHub用户KomachiSion

    2023-05-23 10:25:10
    赞同 展开评论
问答地址: