静态ConcurrentHashMap副本中的值对象是否会引用与原始对象相同的值对象?

时间:2013-08-28 15:53:04

标签: java static synchronized concurrenthashmap

我有两个问题。

我有:     private static ConcurrentHashMap<Integer, Servers> servers= null; 我后来填充。在方法getAllServers中,我这样做:

public static synchronized ConcurrentHashMap<Integer, Server> getAllServers() {
    ConcurrentHashMap<Integer, Server> toReturn = new ConcurrentHashMap<>();
    for(Integer i = 0; i < servers.size(); i ++ ) {
        Server s = servers.get(i);
        if(s.isAlive()) {
            s.incrementConns();
            toReturn.put(i, s);
        }
    }
    return toReturn;
}

问:对s的修改会反映在servers吗?
问:toReturn会引用与servers中相同的服务器对象吗?如果是这样,那么创建和修改getAllServers的返回地图的任何类都会修改与servers相同的对象吗?

更新:@chrylis: 您指的是哪个Iterator?你能解释为什么for循环是一个坏主意吗?我也在其他方面使用它:

Iterator itr = servers.entrySet().iterator();
            Map.Entry pair;
            while(itr.hasNext()) {
                pair = (Map.Entry)itr.next();
                Server s= (Server) pair.getValue();
                ...

但是我没有看到任何错误,因为我知道servers将包含{0}以及从{0}开始的Integer ID的服务器。当我在for循环中迭代它们时,顺序对我来说不是一个问题。

2 个答案:

答案 0 :(得分:3)

是的,是的。就此代码而言,复制Server对象甚至可能可能。这与ConcurrentHashMap无关,也与引用在Java中的工作方式有关。

答案 1 :(得分:2)

  1. servers仅保留对Server个对象的引用:您对基础对象所做的任何修改都将反映在servers中。
  2. Java passes references by value,是的。
  3. 请注意,如果您的代码未正确同步,您可能会在代码中看到陈旧和/或不一致的Server对象,但这是一个不同的问题。