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,28 @@ 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
+ Class <?> c ;
970
971
switch (compilerConfiguration .getCompilerReuseStrategy ()) {
971
972
case AlwaysNew :
972
973
return createJavacClass ();
973
974
case ReuseCreated :
974
- synchronized (javaccClasses ) {
975
- if (javaccClasses .size () > 0 ) {
976
- c = javaccClasses .get (0 );
977
- javaccClasses .remove (c );
978
- return c ;
979
- }
975
+ c = javacClasses .poll ();
976
+ if (c == null ) {
977
+ c = createJavacClass ();
980
978
}
981
- c = createJavacClass ();
982
979
return c ;
983
980
case ReuseSame :
984
981
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 ();
982
+ c = javacClass ;
983
+ if (c = = null ) {
984
+ synchronized ( this ) {
985
+ c = javacClass ;
986
+ if ( c == null ) {
987
+ javacClass = c = createJavacClass ();
988
+ }
992
989
}
993
- return c ;
994
990
}
991
+ return c ;
995
992
}
996
993
}
997
994
0 commit comments