58
58
import java .net .URLClassLoader ;
59
59
import java .util .ArrayList ;
60
60
import java .util .Arrays ;
61
+ import java .util .Deque ;
61
62
import java .util .List ;
62
63
import java .util .Map ;
63
64
import java .util .NoSuchElementException ;
64
65
import java .util .Properties ;
65
66
import java .util .StringTokenizer ;
66
- import java .util .concurrent .CopyOnWriteArrayList ;
67
+ import java .util .concurrent .ConcurrentLinkedDeque ;
67
68
68
69
import org .codehaus .plexus .compiler .AbstractCompiler ;
69
70
import org .codehaus .plexus .compiler .CompilerConfiguration ;
@@ -102,9 +103,9 @@ public class JavacCompiler extends AbstractCompiler {
102
103
103
104
private static final String JAVAC_CLASSNAME = "com.sun.tools.javac.Main" ;
104
105
105
- private static volatile Class <?> JAVAC_CLASS ;
106
+ private volatile Class <?> javacClass ;
106
107
107
- private final List <Class <?>> javaccClasses = new CopyOnWriteArrayList <>();
108
+ private final Deque <Class <?>> javacClasses = new ConcurrentLinkedDeque <>();
108
109
109
110
@ Inject
110
111
private InProcessCompiler inProcessCompiler ;
@@ -955,7 +956,7 @@ private static String getJavacExecutable() throws IOException {
955
956
private void releaseJavaccClass (Class <?> javaccClass , CompilerConfiguration compilerConfiguration ) {
956
957
if (compilerConfiguration .getCompilerReuseStrategy ()
957
958
== CompilerConfiguration .CompilerReuseStrategy .ReuseCreated ) {
958
- javaccClasses .add (javaccClass );
959
+ javacClasses .add (javaccClass );
959
960
}
960
961
}
961
962
@@ -966,32 +967,25 @@ private void releaseJavaccClass(Class<?> javaccClass, CompilerConfiguration comp
966
967
* @throws CompilerException if the class has not been found.
967
968
*/
968
969
private Class <?> getJavacClass (CompilerConfiguration compilerConfiguration ) throws CompilerException {
969
- Class <?> c = null ;
970
970
switch (compilerConfiguration .getCompilerReuseStrategy ()) {
971
971
case AlwaysNew :
972
972
return createJavacClass ();
973
973
case ReuseCreated :
974
- synchronized (javaccClasses ) {
975
- if (javaccClasses .size () > 0 ) {
976
- c = javaccClasses .get (0 );
977
- javaccClasses .remove (c );
978
- return c ;
979
- }
974
+ Class <?> c = javacClasses .poll ();
975
+ if (c == null ) {
976
+ c = createJavacClass ();
980
977
}
981
- c = createJavacClass ();
982
978
return c ;
983
979
case ReuseSame :
984
980
default :
985
- c = JavacCompiler .JAVAC_CLASS ;
986
- if (c != null ) {
987
- return c ;
988
- }
989
- synchronized (JavacCompiler .LOCK ) {
990
- if (c == null ) {
991
- JavacCompiler .JAVAC_CLASS = c = createJavacClass ();
981
+ if (javacClass == null ) {
982
+ synchronized (this ) {
983
+ if (javacClass == null ) {
984
+ javacClass = createJavacClass ();
985
+ }
992
986
}
993
- return c ;
994
987
}
988
+ return javacClass ;
995
989
}
996
990
}
997
991
0 commit comments