8185093: Expensive multi-core choke point when any graphics objects are created

Reviewed-by: prr, flar
This commit is contained in:
Sergey Bylokhov 2017-08-04 18:39:23 -07:00
parent 5b641597ae
commit af3dc52333

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -54,7 +54,6 @@ import sun.security.action.GetPropertyAction;
*/ */
public abstract class GraphicsEnvironment { public abstract class GraphicsEnvironment {
private static GraphicsEnvironment localEnv;
/** /**
* The headless state of the Toolkit and GraphicsEnvironment * The headless state of the Toolkit and GraphicsEnvironment
@ -74,53 +73,60 @@ public abstract class GraphicsEnvironment {
} }
/** /**
* Returns the local {@code GraphicsEnvironment}. * Lazy initialization of local graphics environment using holder idiom.
* @return the local {@code GraphicsEnvironment}
*/ */
public static synchronized GraphicsEnvironment getLocalGraphicsEnvironment() { private static final class LocalGE {
if (localEnv == null) {
localEnv = createGE();
}
return localEnv; /**
* The instance of the local {@code GraphicsEnvironment}.
*/
static final GraphicsEnvironment INSTANCE = createGE();
/**
* Creates and returns the GraphicsEnvironment, according to the
* system property 'java.awt.graphicsenv'.
*
* @return the graphics environment
*/
private static GraphicsEnvironment createGE() {
GraphicsEnvironment ge;
String nm = AccessController.doPrivileged(new GetPropertyAction("java.awt.graphicsenv", null));
try {
// long t0 = System.currentTimeMillis();
Class<?> geCls;
try {
// First we try if the bootstrap class loader finds the
// requested class. This way we can avoid to run in a privileged
// block.
geCls = Class.forName(nm);
} catch (ClassNotFoundException ex) {
// If the bootstrap class loader fails, we try again with the
// application class loader.
ClassLoader cl = ClassLoader.getSystemClassLoader();
geCls = Class.forName(nm, true, cl);
}
ge = (GraphicsEnvironment)geCls.getConstructor().newInstance();
// long t1 = System.currentTimeMillis();
// System.out.println("GE creation took " + (t1-t0)+ "ms.");
if (isHeadless()) {
ge = new HeadlessGraphicsEnvironment(ge);
}
} catch (ClassNotFoundException e) {
throw new Error("Could not find class: "+nm);
} catch (ReflectiveOperationException | IllegalArgumentException e) {
throw new Error("Could not instantiate Graphics Environment: "
+ nm);
}
return ge;
}
} }
/** /**
* Creates and returns the GraphicsEnvironment, according to the * Returns the local {@code GraphicsEnvironment}.
* system property 'java.awt.graphicsenv'. * @return the local {@code GraphicsEnvironment}
*
* @return the graphics environment
*/ */
private static GraphicsEnvironment createGE() { public static GraphicsEnvironment getLocalGraphicsEnvironment() {
GraphicsEnvironment ge; return LocalGE.INSTANCE;
String nm = AccessController.doPrivileged(new GetPropertyAction("java.awt.graphicsenv", null));
try {
// long t0 = System.currentTimeMillis();
Class<?> geCls;
try {
// First we try if the bootstrap class loader finds the
// requested class. This way we can avoid to run in a privileged
// block.
geCls = Class.forName(nm);
} catch (ClassNotFoundException ex) {
// If the bootstrap class loader fails, we try again with the
// application class loader.
ClassLoader cl = ClassLoader.getSystemClassLoader();
geCls = Class.forName(nm, true, cl);
}
ge = (GraphicsEnvironment)geCls.getConstructor().newInstance();
// long t1 = System.currentTimeMillis();
// System.out.println("GE creation took " + (t1-t0)+ "ms.");
if (isHeadless()) {
ge = new HeadlessGraphicsEnvironment(ge);
}
} catch (ClassNotFoundException e) {
throw new Error("Could not find class: "+nm);
} catch (ReflectiveOperationException | IllegalArgumentException e) {
throw new Error("Could not instantiate Graphics Environment: "
+ nm);
}
return ge;
} }
/** /**