我有收集所有与此代码是一个码头web服务器内运行一个给定的前缀Java属性variabile的:设置属性,而迭代键
private static List<String> getKeysByPrefix(String prefix) {
Set<?> keySet = System.getProperties().keySet();
Iterator<?> iterator = keySet.iterator();
List<String> list = new ArrayList<>();
while (iterator.hasNext()) {
String key = (String) iterator.next();
if (key.startsWith(prefix)) {
list.add(key);
}
}
return list;
}
启动系统的属性键码,同时请求被执行这段代码,它可能发生的另一个请求写Java系统属性里面像一个简单的System.setProperty("test", "foo");
有了这个场景我得到一个ConcurrentModificationException
而我迭代的属性和另一个请求更改的新重点它。
java.util.ConcurrentModificationException
at java.util.Hashtable$Enumerator.next(Hashtable.java:1378)
其设置新的属性是完全相对于一个迭代的钥匙另一个流,但因为SystemProperties是在所有的JVM实例共享,我得到这个错误代码。
我已经发现了其他处理这个主题的主题,最推荐的解决方案是使用ConcurrentHashMap。这个选项对我来说不可用,因为我不是创建SystemProperties映射的映射,但我只是读/写它。
为了再现你可以简单地迭代循环
在这里是一个推荐的做法,以解决问题的结束括号前添加一个setProperty
调用的问题?
您可能希望只有一个线程能够在任何给定时间修改系统属性。 – Mena
你如何更新属性?使用'System.setProperty'? – manouti