[jdk9] RFR: 8159822: Non-synchronized access to shared members of com.sun.jndi.ldap.pool.Pool
Ivan Gerasimov
ivan.gerasimov at oracle.com
Fri Jun 24 14:56:41 UTC 2016
Hi Aleksey!
I've double-checked the Pool class and found no other code that has to
be additionally synchronized.
Please note that the method expungeStaleConnections() is thread-safe and
can be called from outside the synchronized blocks.
The method Pool.getConnections(Object) accesses the `map` field, but it
is only called from synchronized blocks, so it's fine.
Please let me know, if I'm missing something obvious.
With kind regards,
Ivan
On 21.06.2016 19:25, Ivan Gerasimov wrote:
>
>
> On 21.06.2016 18:43, Aleksey Shipilev wrote:
>> 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 }
> But this is ConnectionsWeakRef.getConnections() not
> Pool.getConnections(Object).
> As far as I can see, an instance of ConnectionsWeakRef cannot be
> accessed concurrently.
>
>>
>> ...
>>
>> 117 public PooledConnection getPooledConnection(Object id, long
>> timeout,
>> 118 PooledConnectionFactory factory) throws NamingException {
>> ...
>> // no synchronized prior here
>> 127 expungeStaleConnections();
>> ...
>>
> expungeStaleConnections() should be safe to call concurrently as long
> as ReferenceQueue.poll() is thread-safe.
>
> With kind regards,
> Ivan
>
>
More information about the core-libs-dev
mailing list