On 06/21/2016 06:14 PM, Ivan Gerasimov wrote: > Hello! > > The Pool has a member `map`, which is accessed from different threads, > thus the access is synchronized. > However, in some code paths (mostly in debug printing) it is accessed > without proper synchronization, which results in intermediate > ConcurrentModificationException when the debug output is turned on. > > Would you please help review the fix? > > BUGURL: https://bugs.openjdk.java.net/browse/JDK-8159822 > WEBREV: http://cr.openjdk.java.net/~igerasim/8159822/00/webrev/
Missed synchronized-s: 154 private Connections getConnections(Object id) { 155 ConnectionsRef ref = map.get(id); 156 return (ref != null) ? ref.getConnections() : null; 157 } ...gets called via: 168 public void expire(long threshold) { 169 synchronized (map) { ... 179 } 180 expungeStaleConnections(); 181 } ...and also via: 188 private static void expungeStaleConnections() { ... 192 Connections conns = releaseRef.getConnections(); ... 203 } 204 } ... 117 public PooledConnection getPooledConnection(Object id, long timeout, 118 PooledConnectionFactory factory) throws NamingException { ... // no synchronized prior here 127 expungeStaleConnections(); ... Thanks, -Aleksey