求教这个code啥意思?

ContextUtil.java

protected static Context trueEnter(String name, String origin) {
    Context context = contextHolder.get();
    if (context == null) {
        Map<String, DefaultNode> localCacheNameMap = contextNameNodeMap;
        DefaultNode node = localCacheNameMap.get(name);
        if (node == null) {
            if (localCacheNameMap.size() > Constants.MAX_CONTEXT_NAME_SIZE) {
                setNullContext();
                return NULL_CONTEXT;
            } else {
                LOCK.lock();
                try {
                    node = contextNameNodeMap.get(name);
                    if (node == null) {
                        // 同上
                        if (contextNameNodeMap.size() > Constants.MAX_CONTEXT_NAME_SIZE) {
                            setNullContext();
                            return NULL_CONTEXT;
                        } else {
                            node = new EntranceNode(new StringResourceWrapper(name, EntryType.IN), null);
                            // Add entrance node.
                            Constants.ROOT.addChild(node);
                            // 这里为什么不直接conextNameNodeMap.put一个值。而是新写一个map,然后执行putAll
                            Map<String, DefaultNode> newMap = new HashMap<>(contextNameNodeMap.size() + 1);
                            newMap.putAll(contextNameNodeMap);
                            newMap.put(name, node);
                            contextNameNodeMap = newMap;
                        }
                    }
                } finally {
                    // unlock
                    LOCK.unlock();
                }
            }
        }
        context = new Context(node, name);
        context.setOrigin(origin);
        contextHolder.set(context);
    }

    return context;
}

这样写是防止出现这个错吗?ConcurrentModificationException

想问问是否还有其他方式来实现这个

原提问者GitHub用户huskyui

展开
收起
学习娃 2023-05-19 14:31:08 95 分享 版权
1 条回答
写回答
取消 提交回答
  • 1.double check双重检查

    2.我认为这里有Lock的话直接put不存在ConcurrentModificationException。使用重新构建一个新Map再覆盖的方式,主要是为了避免resize时重新Hash带来的性能影响,不能因一个resize操作而长时间不释放锁 (注意这个Lock是全局的)

    原回答者GitHub用户icodening

    2023-05-19 20:09:05
    赞同 展开评论
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

还有其他疑问?
咨询AI助理