2011/9/20 sebb <seb...@gmail.com>:
> On 19 September 2011 17:30,  <ma...@apache.org> wrote:
>> Author: markt
>> Date: Mon Sep 19 16:30:36 2011
>> New Revision: 1172689
>>
>> URL: http://svn.apache.org/viewvc?rev=1172689&view=rev
>> Log:
>> Fix threading issue with changing visibility of methods and fields
>>
>> Modified:
>>    tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java
>>
>> Modified: 
>> tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java
>> URL: 
>> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java?rev=1172689&r1=1172688&r2=1172689&view=diff
>> ==============================================================================
>> --- tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java 
>> (original)
>> +++ tomcat/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java 
>> Mon Sep 19 16:30:36 2011
>> @@ -187,9 +187,11 @@ public class DefaultInstanceManager impl
>>             if (entry.getType() == AnnotationCacheEntryType.POST_CONSTRUCT) {
>>                 Method postConstruct = (Method) entry.getAccessibleObject();
>>                 boolean accessibility = postConstruct.isAccessible();
>> -                postConstruct.setAccessible(true);
>> -                postConstruct.invoke(instance);
>> -                postConstruct.setAccessible(accessibility);
>> +                synchronized (postConstruct) {
>> +                    postConstruct.setAccessible(true);
>> +                    postConstruct.invoke(instance);
>> +                    postConstruct.setAccessible(accessibility);
>> +                }
>
> Could skip the synch. block and two method calls if the field is
> already accessible:
>
> if (accessibility) {
>    postConstruct.invoke(instance);
> } else {
>    synchronized (postConstruct) {
>        postConstruct.setAccessible(true);
>        postConstruct.invoke(instance);
>        postConstruct.setAccessible(accessibility);
>    }
> }
>
> Similarly for the other synch. blocks below.
>
My understanding is that "isAccessible()" is false by default for a
new instance of Method object (regardless of whether the method and
class are public), and so your proposed optimization actually will
never work.

My thought is that setAccessible(true); can be called once - when the
annotation is detected and placed into the cache.

Best regards,
Konstantin Kolinko

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to