8185093: Expensive multi-core choke point when any graphics objects are created
Reviewed-by: prr, flar
This commit is contained in:
parent
5b641597ae
commit
af3dc52333
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user