鍍金池/ 問(wèn)答/Java  Linux/ 請(qǐng)問(wèn)java并發(fā)編程中這種變量怎么處理?如下圖

請(qǐng)問(wèn)java并發(fā)編程中這種變量怎么處理?如下圖

    /** 
     * 從指定節(jié)點(diǎn)Element node開(kāi)始,遞歸遍歷其所有子節(jié)點(diǎn) 
     */  
    static Map<String, Object> map2 = new HashMap<String,Object>();
    public static Map<String, Object> getNodes(Element node) {  
        System.out.println("當(dāng)前節(jié)點(diǎn):" + node.getName() + ":" + node.getTextTrim());// 當(dāng)前節(jié)點(diǎn)名稱  
        map2.put(node.getName(), node.getTextTrim());
        // 遞歸遍歷當(dāng)前節(jié)點(diǎn)所有的子節(jié)點(diǎn)  
        List<Element> listElement = node.elements();// 所有一級(jí)子節(jié)點(diǎn)的list  
        for (final Element e : listElement) {// 遍歷所有一級(jí)子節(jié)點(diǎn)  
            getNodes(e);// 遞歸  
        }  
        return map2;
    }

并發(fā)的時(shí)候這個(gè)map2怎么處理?加上volatile關(guān)鍵字可以嗎?

static volatile Map<String, Object> map2 = new HashMap<String,Object>();
回答
編輯回答
尛曖昧

使用ConcurrentHashMap:new ConcurrentHashMap<String,Object>();
或者Collections的靜態(tài)內(nèi)部類synchronizedMap:Collections.synchronizedMap都可以

2017年12月1日 10:48
編輯回答
局外人

需要對(duì)getNodes方法進(jìn)行synchronized, 因?yàn)閙ap2創(chuàng)建了后地址不再改變(不再new), volatile關(guān)鍵字是不需要的. 但你的方法直接把map2返回了,如果或其它調(diào)用的地方對(duì)map2進(jìn)行修改, 也會(huì)引起并發(fā)的問(wèn)題, 所以最好返回

return Collections.synchronizedMap(your_map);

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

2017年4月11日 13:35