Possible atomicity violations when composing concurrent collections operations

Phil Race philip.race at oracle.com
Thu Aug 2 14:16:41 PDT 2012


On 8/2/2012 11:52 AM, Yu Lin wrote:
> My name is Yu Lin. I'm a Ph.D. student in the CS department at
> UIUC. I'm currently doing research on mining Java concurrent library
> misuses. I found some uses of concurrent collections in OpenJDK7u may
> result in potential atomicity violation bugs or harm the performance.
....

> Another possible atomicity vioaltion may happen at line 892 in
> jdk/src/share/classes/sun/font/FileFontStrike.java:
>
> L891  if (boundsMap == null) {
> L892      boundsMap = new ConcurrentHashMap<Integer, Rectangle2D.Float>();
> L893  }
>        // some<key, value>  pairs are put into "boundsMap"
>
> A possible buggy scenario is both threads T1 and T2 finds "boundsMap"
> is null at the same time (line 891). After T1 creates a new empty map
> and puts some<key, value>  pairs into "boundsMap", T2 also creates an
> empty map and writes to "boundsMap". Then the<key, value>  pairs put
> by T1 will be lost. If this scenario may happen and lead to bug, we
> have to add synchronization when initializing "boundsMap".

I haven't looked at the rest but I'll comment on that one.
This is deliberate. The tradeoff is all uses being synchronized versus
the small chance that two threads try to create this map at the same
time, which really doesn't matter. Its just a tiny bit of lost work.
We could have a debate about how uncontended synchronization
is cheap but adding  it somewhat defeats the purpose of using
ConcurrentHashMap. Also if there are two threads active here,
meriting the synchronization then the lock probably is contended ..

Also I am not sure how your patch below would work.
Synchronizing on (null) isn't likely to fix anything.
Instead you just introduced a NullPointerException.

Finally jdk8-dev is probably the "main" list these days.

-phil.

> I append a patch to show how to fix the above four problems. I can also list
> all of such code I found if you need.
>
> Regards,
> Yu
>
> ===============================================================
>
> diff -r 7daf4a4dee76 src/share/classes/sun/font/FileFontStrike.java
> --- a/src/share/classes/sun/font/FileFontStrike.java	Mon May 07
> 14:59:29 2012 -0700
> +++ b/src/share/classes/sun/font/FileFontStrike.java	Thu Aug 02
> 11:50:46 2012 -0500
> @@ -887,9 +887,10 @@
>        * up in Java code either.
>        */
>       Rectangle2D.Float getGlyphOutlineBounds(int glyphCode) {
> -
> -        if (boundsMap == null) {
> -            boundsMap = new ConcurrentHashMap<Integer, Rectangle2D.Float>();
> +        synchronized (boundsMap) {
> +            if (boundsMap == null) {
> +                boundsMap = new ConcurrentHashMap<Integer,
> Rectangle2D.Float>();
> +            }
>           }
>
>           Integer key = Integer.valueOf(glyphCode);




More information about the jdk7u-dev mailing list