[OpenJDK 2D-Dev] RFR: 8054991 : sun.font.GlyphList uses broken double-checked locking
prasanta sadhukhan
prasanta.sadhukhan at oracle.com
Thu May 26 12:06:03 UTC 2016
Hi Phil,
On 5/26/2016 3:48 AM, Phil Race wrote:
> bug : https://bugs.openjdk.java.net/browse/JDK-8054991
>
> There is a comment in there about a proposed patch but I can't find it.
I guess the proposed patch suggested was this:
diff -r 84ff8117acd2 src/share/classes/sun/font/GlyphList.java
--- a/src/share/classes/sun/font/GlyphList.java Mon Aug 11 09:26:05
2014 -0400
+++ b/src/share/classes/sun/font/GlyphList.java Tue Aug 19 08:16:53
2014 -0400
@@ -29,6 +29,7 @@
import java.awt.font.GlyphVector;
import java.awt.font.FontRenderContext;
import sun.java2d.loops.FontInfo;
+import java.util.concurrent.atomic.AtomicBoolean;
/*
* This class represents a list of actual renderable glyphs.
@@ -151,8 +152,8 @@
* occur and if it did, it would just lead to some extra garbage being
* created.
*/
- private static GlyphList reusableGL = new GlyphList();
- private static boolean inUse;
+ private static final GlyphList reusableGL = new GlyphList();
+ private static final AtomicBoolean inUse = new AtomicBoolean(false);
void ensureCapacity(int len) {
@@ -184,25 +185,10 @@
// }
public static GlyphList getInstance() {
- /* The following heuristic is that if the reusable instance is
- * in use, it probably still will be in a micro-second, so avoid
- * synchronising on the class and just allocate a new instance.
- * The cost is one extra boolean test for the normal case, and some
- * small number of cases where we allocate an extra object when
- * in fact the reusable one would be freed very soon.
- */
- if (inUse) {
+ if (inUse.compareAndSet(false, true))
+ return reusableGL;
+ else
return new GlyphList();
- } else {
- synchronized(GlyphList.class) {
- if (inUse) {
- return new GlyphList();
- } else {
- inUse = true;
- return reusableGL;
- }
- }
- }
}
/* In some cases the caller may be able to estimate the size of
@@ -423,7 +409,7 @@
}
usePositions = false;
strikelist = null; // remove reference to the strike list
- inUse = false;
+ inUse.set(false);
}
}
Regards
Prasanta
> However I think this will be sufficient :-
>
> diff --git a/src/java.desktop/share/classes/sun/font/GlyphList.java
> b/src/java.desktop/share/classes/sun/font/GlyphList.java
> --- a/src/java.desktop/share/classes/sun/font/GlyphList.java
> +++ b/src/java.desktop/share/classes/sun/font/GlyphList.java
> @@ -152,7 +152,7 @@
> * created.
> */
> private static GlyphList reusableGL = new GlyphList();
> - private static boolean inUse;
> + private static volatile boolean inUse;
>
> -phil.
More information about the 2d-dev
mailing list