[ https://issues.apache.org/jira/browse/OGNL-34?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13139445#comment-13139445 ]
Adrian Cumiskey commented on OGNL-34: ------------------------------------- I think making ExpressionCompiler a singleton is a good idea. If we did decide to do this then we should also consider refactoring ExpressionCompiler as it currently has many static methods - perhaps migrating all of them to a companion ExpressionCompilerUtil. I see two other options... A) We take a small performance hit and wrap _compiler in a synchronized block. B) We choose to not use the ClassResolver held by the OgnlContext but instead use OgnlContext.DEFAULT_CLASS_RESOLVER for resolving. Then there wouldn't be any need to synchronize access to _compiler because the resolution wouldn't be dependent on OgnlContext, we could instantiate ExpressionCompiler immediately. I think it would be a rare case that a custom class resolver would be required to ensure that javaassist is available. Thoughts? > OgnlRuntime.getCompiler and thread-safety. > ------------------------------------------ > > Key: OGNL-34 > URL: https://issues.apache.org/jira/browse/OGNL-34 > Project: OGNL > Issue Type: Bug > Reporter: Maurizio Cucchiara > Priority: Minor > Labels: concurrency, thread-safety > > As you can see, {{getCompiler}} is not thread safe. > I recently added a new performance benchmark to test its 3d-safety and > performance: during my tests I have experienced a fast execution on unsafe > version vs the safe one (though every concurrent test instantiated a new > compiler). > I have not yet investigated and I still don't know what can cause running > more than one instance of the compiler in the same jvm. If necessary we can > consider to make compiler a singleton in order to enforce this concept. > > What do you think guys? > {code} > public static OgnlExpressionCompiler getCompiler( OgnlContext ognlContext ) > > { > > if ( _compiler == null ) > > { > > try > > { > > OgnlRuntime.classForName( ognlContext, "javassist.ClassPool" ); > > _compiler = new ExpressionCompiler(); > > } > > catch ( ClassNotFoundException e ) > > { > > throw new IllegalArgumentException( > > "Javassist library is missing in classpath! Please add missed > dependency!", e ); > } > > } > > return _compiler; > > } > {code} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira