为什么原始地图中的更改会反映在syncedMap副本中?

时间:2019-03-21 05:48:44

标签: java hashmap synchronized

我知道,由于 synchronizedMap()的内部实现,对象副本中的任何更改都会反映在原始备份中。 (1)

但是,我不知道为什么原始地图中的更改会反映在同步副本中?任何线索都将有所帮助。 (2)

import static java.lang.System.out;
import static java.lang.System.in;
import java.util.*;

class Test{
public static void main(String[] args){
    HashMap m=new HashMap();
    m.put(102,"AAA");
    m.put(104,"BBB");
    m.put(14,"CCC");

    out.println(m);
    Map m1=Collections.synchronizedMap(m);
    out.println(m1);

    Object obj=m1.remove(14); // 1
    m1.put(54,obj);
    out.println(m);
    out.println(m1);

    Object obj1=m.remove(54); // 2
    m.put(13,obj1);
    out.println(m);
    out.println(m1);
}
}

2 个答案:

答案 0 :(得分:0)

该文档明确指出返回的地图为backed by the current map

  

返回由指定映射支持的同步(线程安全)映射。

对返回的地图所做的任何更改都会反映到当前地图中,反之亦然。

但是,

  

为了保证串行访问,至关重要的是,对后备映射的所有访问都必须通过返回的映射来完成。

答案 1 :(得分:0)

两个地图都引用相同的对象,而您正在对其进行处理。因此,两者都引用了修改的。这意味着,修改同步映射会使原始引用更改的数据,但是反之亦然。

如果您有两个未同步的Map或两个Collections,则同样。