我知道,由于 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);
}
}
答案 0 :(得分:0)
该文档明确指出返回的地图为backed by the current map:
返回由指定映射支持的同步(线程安全)映射。
对返回的地图所做的任何更改都会反映到当前地图中,反之亦然。
但是,
为了保证串行访问,至关重要的是,对后备映射的所有访问都必须通过返回的映射来完成。
答案 1 :(得分:0)
两个地图都引用相同的对象,而您正在对其进行处理。因此,两者都引用了修改的。这意味着,修改同步映射会使原始引用更改的数据,但是反之亦然。
如果您有两个未同步的Map
或两个Collections
,则同样。