我在讀取 JVM 配置屬性時(shí)遇到了問(wèn)題,System.getProperties()因?yàn)樵谀承┉h(huán)境中我java.util.ConcurrentModificationException在 JVM 重新啟動(dòng)后遇到了問(wèn)題。[err] java.util.ConcurrentModificationException [err] at java.util.Hashtable$Enumerator.next(Hashtable.java:1502)為了避免前面提到的錯(cuò)誤,我必須多次重新啟動(dòng) VM。到目前為止我做了什么:同步屬性鍵和值被讀取和寫入日志文件的方法;因?yàn)?Java 的 Properties 對(duì)象是一個(gè) HashMap,所以我嘗試使用同步 Map;我試圖通過(guò)使用更多共享相同 Properties 對(duì)象的線程來(lái)模擬并發(fā)問(wèn)題,但是我無(wú)法在本地環(huán)境中重現(xiàn)該錯(cuò)誤;由于線程安全,我正在使用 StringBuffer;private static final Logger LOG = LoggerFactory.getLogger(PropertyLogger.class);public static synchronized final void logProperties() { Level oldLevel = LOG.getLevel(); LOG.setLevel(Level.INFO); Properties props = System.getProperties(); Map<Object, Object> shared = Collections.synchronizedMap(new HashMap<>()); shared.putAll(props); for (final Entry<Object, Object> entry : shared.entrySet()) { try{ StringBuffer buffer = new StringBuffer(); buffer.append(entry.getKey()); buffer.append(" = "); //$NON-NLS-1$ buffer.append(entry.getValue()); LOG.info(buffer.toString()); } catch (Exception ex){ ex.printStackTrace(); } } LOG.setLevel(oldLevel); }我可能是我正在處理的問(wèn)題也由用于編寫的 log4j 庫(kù)觸發(fā),我知道這不是線程安全的。我添加了堆棧跟蹤:[err] java.util.ConcurrentModificationException [err] at java.util.Hashtable$Enumerator.next(Hashtable.java:1502) [err] at com.myapp.common.PropertyLogger.logProperties(PropertyLogger.java:23) [err] ] 在 com.myapp.input.ConfigurationServer.parse(ConfigurationServer.java:710) [err] 在 com.myapp.input.ConfigurationServer.configure(ConfigurationServer.java:94) [err] 在 com.myapp.input.Application。運(yùn)行(Application.java:78)[err] 在 com.myapp.input.servlet.InputStarter$ValidatorThread.run(InputStarter.java:113)問(wèn)候,PS:我應(yīng)該添加同步塊來(lái)調(diào)用方法嗎?例如:在 parse 方法中應(yīng)該調(diào)用我的代碼synchronized(this) { PropertyLogger.logProperties();}
1 回答

MM們
TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊
問(wèn)題不在于日志框架,而在于行
shared.putAll(props);
Properties
類擴(kuò)展Hashtable
,系統(tǒng)屬性可以隨時(shí)更改。隨著shared.putAll(props)
您迭代類的對(duì)象props
,Properties(Hashtable)
如果在迭代過(guò)程中修改了任何值,我們將得到這個(gè)錯(cuò)誤ConcurrentModificationException
一個(gè)解決方案是在迭代之前在 System.Properties() 對(duì)象上調(diào)用 clone()
添加回答
舉報(bào)
0/150
提交
取消