Java 静态ConcurrentHashMap副本中的值对象是否会引用与原始值对象相同的值对象?
我有一个由两部分组成的问题Java 静态ConcurrentHashMap副本中的值对象是否会引用与原始值对象相同的值对象?,java,static,synchronized,concurrenthashmap,Java,Static,Synchronized,Concurrenthashmap,我有一个由两部分组成的问题 Iterator itr = servers.entrySet().iterator(); Map.Entry pair; while(itr.hasNext()) { pair = (Map.Entry)itr.next(); Server s= (Server) pair.getValue(); ... 我有: 私有静态
Iterator itr = servers.entrySet().iterator();
Map.Entry pair;
while(itr.hasNext()) {
pair = (Map.Entry)itr.next();
Server s= (Server) pair.getValue();
...
我有:
私有静态ConcurrentHashMap服务器=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;
}
Iterator itr = servers.entrySet().iterator();
Map.Entry pair;
while(itr.hasNext()) {
pair = (Map.Entry)itr.next();
Server s= (Server) pair.getValue();
...
但是我没有看到任何错误,因为我知道服务器
将包含ID从0开始的整数
服务器。当我在for循环中迭代它们时,顺序对我来说并不重要。是和是。就这段代码而言,甚至可能无法复制Server
对象。这与ConcurrentHashMap
无关,与Java中引用的工作方式有关。是和是。就这段代码而言,甚至可能无法复制Server
对象。这与ConcurrentHashMap
无关,与Java中引用的工作方式有关
Iterator itr = servers.entrySet().iterator();
Map.Entry pair;
while(itr.hasNext()) {
pair = (Map.Entry)itr.next();
Server s= (Server) pair.getValue();
...
服务器
仅保存对服务器
对象的引用:您对基础对象所做的任何修改都将反映在服务器
中
是的
请注意,如果代码没有正确同步,您可能会在代码中看到过时和/或不一致的Server
对象,但这是另一个问题
Iterator itr = servers.entrySet().iterator();
Map.Entry pair;
while(itr.hasNext()) {
pair = (Map.Entry)itr.next();
Server s= (Server) pair.getValue();
...
服务器
仅保存对服务器
对象的引用:您对基础对象所做的任何修改都将反映在服务器
中
是的
请注意,如果代码没有正确同步,您可能会在代码中看到过时和/或不一致的Server
对象,但这是另一个问题。Read to start<代码>ConcurrentHashMap
并不重要。您需要理解对象引用。对于初学者来说,您的循环非常脆弱;不能保证您的密钥是一组连续的数字,如果有,则列表将更有意义。有没有理由不在服务器上迭代。entrySet()
?另外,您谈论的是“值对象”,但是s.incrementConns()
听起来像一个变种人。是的,是的,还有Yes@chrylis:用于服务器对象的键是类中的整数参数,该参数在静态ServerCreator类中构造对象时分配给对象。顺序无关紧要,只要迭代遍历映射的所有值,这些值都是服务器对象。是的,incrementConns()
是一个修改对象另一个参数的变数-在同一个循环中使用变数是不是一个坏主意?迭代器不会遍历所有值,除非它们在映射长度减去1的过程中始终正好为0。读取开始<代码>ConcurrentHashMap
并不重要。您需要理解对象引用。对于初学者来说,您的循环非常脆弱;不能保证您的密钥是一组连续的数字,如果有,则列表将更有意义。有没有理由不在服务器上迭代。entrySet()
?另外,您谈论的是“值对象”,但是s.incrementConns()
听起来像一个变种人。是的,是的,还有Yes@chrylis:用于服务器对象的键是类中的整数参数,该参数在静态ServerCreator类中构造对象时分配给对象。顺序无关紧要,只要迭代遍历映射的所有值,这些值都是服务器对象。是的,incrementConns()
是一个修改对象另一个参数的变量-在同一个循环中使用变量是一个坏主意吗?迭代器不会遍历所有的值,除非它们在映射长度减去1的过程中始终正好为0。
Iterator itr = servers.entrySet().iterator();
Map.Entry pair;
while(itr.hasNext()) {
pair = (Map.Entry)itr.next();
Server s= (Server) pair.getValue();
...