请问java并发编程中这种变量怎么处理?如下图

    /** 
     * 从指定节点Element node开始,递归遍历其所有子节点 
     */  
    static Map<String, Object> map2 = new HashMap<String,Object>();
    public static Map<String, Object> getNodes(Element node) {  
        System.out.println("当前节点:" + node.getName() + ":" + node.getTextTrim());// 当前节点名称  
        map2.put(node.getName(), node.getTextTrim());
        // 递归遍历当前节点所有的子节点  
        List<Element> listElement = node.elements();// 所有一级子节点的list  
        for (final Element e : listElement) {// 遍历所有一级子节点  
            getNodes(e);// 递归  
        }  
        return map2;
    }

并发的时候这个map2怎么处理?加上volatile关键字可以吗?

static volatile Map<String, Object> map2 = new HashMap<String,Object>();
阅读 2.2k
2 个回答

需要对getNodes方法进行synchronized, 因为map2创建了后地址不再改变(不再new), volatile关键字是不需要的. 但你的方法直接把map2返回了,如果或其它调用的地方对map2进行修改, 也会引起并发的问题, 所以最好返回

return Collections.synchronizedMap(your_map);

https://docs.oracle.com/javas...

使用ConcurrentHashMap:new ConcurrentHashMap<String,Object>();
或者Collections的静态内部类synchronizedMap:Collections.synchronizedMap都可以

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题