[ https://issues.apache.org/jira/browse/OGNL-20?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13098108#comment-13098108 ]
Maurizio Cucchiara commented on OGNL-20: ---------------------------------------- Hi Simone, to answer your questions... {quote} Which complexity has lock/unlock objects? I'm asking because I don't know. {quote} I am not sure I understood your question, I guess that lock and unlock are atomic. {quote} Can you point me please to ConcurrentHashMap doc wich explain how locks only small part of itself and not the whole data? {quote} Please, take a look at the [implementation|http://www.google.it/codesearch#-WpwJU0UKqQ/src/share/classes/java/util/concurrent/ConcurrentHashMap.java&q=ConcurrentHashMap&type=cs&l=242], you will see that, internally, CHM uses (and hence locks) a segment as a unit of work (where segment is a small subset of the whole map). {quote} except that, for what I can see, the m.getParameterTypes() that worries you, in the first implementation is invoked only when the key is not found, in the second is always invoked. {quote} you are right, we should clarify how much cost the computation of the final object value. Anyway I would not unwrap the {{putIfAbsent}} invocation from the existence check: {code} Map _methodParameterTypesCache = new ConcurrentHashMap(); if ( ( result = (Class[]) _methodParameterTypesCache.get( m )) == null ) { _methodParameterTypesCache.puIfAbsent( m, result = m.getParameterTypes() ); } return result; {code} There are many other aspect to take into account: for example CHM doesn't support null value. from the javadoc: {quote} Like Hashtable but unlike HashMap, this class does not allow null to be used as a key or value. {quote} > Performance - Replace synchronized blocks with ReentrantReadWriteLock > --------------------------------------------------------------------- > > Key: OGNL-20 > URL: https://issues.apache.org/jira/browse/OGNL-20 > Project: OGNL > Issue Type: Improvement > Environment: ALL > Reporter: Greg Lively > > I've noticed a lot of synchronized blocks of code in OGNL. For the most part, > these synchronized blocks are controlling access to HashMaps, etc. I believe > this could be done far better using ReentrantReadWriteLocks. > ReentrantReadWriteLock allows unlimited concurrent access, and single threads > only for writes. Perfect in an environment where the ratio of reads is far > higher than writes; which is typically the scenario for caching. Plus the > access control can be tuned for reads and writes; not just a big > synchronized{} wrapping a bunch of code. -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira