Filip Hanik - Dev Lists wrote:
> I'm generally against this find bugs 'may be bugs' issues.
> is there an actual bug here?

Reported bug, no. Bugs uses could hit, yes. Hence why this is in trunk
and not being proposed for backport.

Are all the syncs necessary? I haven't looked in detail but I suspect
that right now, that most of them are not. As we increase JMX
functionality and have more dynamic configuration then we'll almost
certainly need them so I don't see the harm in getting this right now.

Mark

> 
> Filip
> 
> ma...@apache.org wrote:
>> Author: markt
>> Date: Wed Apr  8 16:08:42 2009
>> New Revision: 763298
>>
>> URL: http://svn.apache.org/viewvc?rev=763298&view=rev
>> Log:
>> Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=46990
>> Various sync issues.
>>
>> Modified:
>>     tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
>>     tomcat/trunk/java/org/apache/catalina/core/StandardHost.java
>>    
>> tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java
>>     tomcat/trunk/java/org/apache/catalina/util/InstanceSupport.java
>>     tomcat/trunk/java/org/apache/catalina/util/LifecycleSupport.java
>>
>> Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
>> URL:
>> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=763298&r1=763297&r2=763298&view=diff
>>
>> ==============================================================================
>>
>> --- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
>> (original)
>> +++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
>> Wed Apr  8 16:08:42 2009
>> @@ -201,6 +201,8 @@
>>       * application, in the order they were encountered in the web.xml
>> file.
>>       */
>>      private String applicationListeners[] = new String[0];
>> +    +    private final Object applicationListenersLock = new Object();
>>  
>>  
>>      /**
>> @@ -223,6 +225,8 @@
>>      private ApplicationParameter applicationParameters[] =
>>          new ApplicationParameter[0];
>>  
>> +    private final Object applicationParametersLock = new Object();
>> +     
>>      /**
>>       * The application available flag for this Context.
>> @@ -263,6 +267,8 @@
>>       * The security constraints for this web application.
>>       */
>>      private SecurityConstraint constraints[] = new
>> SecurityConstraint[0];
>> +    +    private final Object constraintsLock = new Object();
>>  
>>  
>>      /**
>> @@ -364,6 +370,9 @@
>>       * defined in the deployment descriptor.
>>       */
>>      private FilterMap filterMaps[] = new FilterMap[0];
>> +    +    private final Object filterMapsLock = new Object();
>> +
>>  
>>      /**
>>       * Filter mappings added via {...@link ServletContext} may have to
>> be inserted
>> @@ -388,6 +397,8 @@
>>       */
>>      private String instanceListeners[] = new String[0];
>>  
>> +    private final Object instanceListenersLock = new Object();
>> +
>>  
>>      /**
>>       * The login configuration descriptor for this web application.
>> @@ -508,6 +519,8 @@
>>       */
>>      private String securityRoles[] = new String[0];
>>  
>> +    private final Object securityRolesLock = new Object();
>> +
>>  
>>      /**
>>       * The servlet mappings for this web application, keyed by
>> @@ -515,6 +528,8 @@
>>       */
>>      private HashMap<String, String> servletMappings =
>>          new HashMap<String, String>();
>> +    +    private final Object servletMappingsLock = new Object();
>>  
>>  
>>      /**
>> @@ -559,12 +574,16 @@
>>       */
>>      private String watchedResources[] = new String[0];
>>  
>> +    private final Object watchedResourcesLock = new Object();
>> +
>>  
>>      /**
>>       * The welcome files for this application.
>>       */
>>      private String welcomeFiles[] = new String[0];
>>  
>> +    private final Object welcomeFilesLock = new Object();
>> +
>>  
>>      /**
>>       * The set of classnames of LifecycleListeners that will be added
>> @@ -572,6 +591,7 @@
>>       */
>>      private String wrapperLifecycles[] = new String[0];
>>  
>> +    private final Object wrapperLifecyclesLock = new Object();
>>  
>>      /**
>>       * The set of classnames of ContainerListeners that will be added
>> @@ -579,6 +599,7 @@
>>       */
>>      private String wrapperListeners[] = new String[0];
>>  
>> +    private final Object wrapperListenersLock = new Object();
>>  
>>      /**
>>       * The pathname to the work directory for this context (relative to
>> @@ -2021,7 +2042,7 @@
>>       */
>>      public void addApplicationListener(String listener) {
>>  
>> -        synchronized (applicationListeners) {
>> +        synchronized (applicationListenersLock) {
>>              String results[] =new String[applicationListeners.length
>> + 1];
>>              for (int i = 0; i < applicationListeners.length; i++) {
>>                  if (listener.equals(applicationListeners[i])) {
>> @@ -2048,7 +2069,7 @@
>>       */
>>      public void addApplicationParameter(ApplicationParameter
>> parameter) {
>>  
>> -        synchronized (applicationParameters) {
>> +        synchronized (applicationParametersLock) {
>>              String newName = parameter.getName();
>>              for (int i = 0; i < applicationParameters.length; i++) {
>>                  if
>> (newName.equals(applicationParameters[i].getName()) &&
>> @@ -2145,7 +2166,7 @@
>>          }
>>  
>>          // Add this constraint to the set for our web application
>> -        synchronized (constraints) {
>> +        synchronized (constraintsLock) {
>>              SecurityConstraint results[] =
>>                  new SecurityConstraint[constraints.length + 1];
>>              for (int i = 0; i < constraints.length; i++)
>> @@ -2231,7 +2252,7 @@
>>  
>>          validateFilterMap(filterMap);
>>          // Add this filter mapping to our registered set
>> -        synchronized (filterMaps) {
>> +        synchronized (filterMapsLock) {
>>              FilterMap results[] =new FilterMap[filterMaps.length + 1];
>>              System.arraycopy(filterMaps, 0, results, 0,
>> filterMaps.length);
>>              results[filterMaps.length] = filterMap;
>> @@ -2256,7 +2277,7 @@
>>          validateFilterMap(filterMap);
>>  
>>          // Add this filter mapping to our registered set
>> -        synchronized (filterMaps) {
>> +        synchronized (filterMapsLock) {
>>              FilterMap results[] = new FilterMap[filterMaps.length + 1];
>>              System.arraycopy(filterMaps, 0, results, 0,
>> filterMapInsertPoint);
>>              results[filterMapInsertPoint] = filterMap;
>> @@ -2313,7 +2334,7 @@
>>       */
>>      public void addInstanceListener(String listener) {
>>  
>> -        synchronized (instanceListeners) {
>> +        synchronized (instanceListenersLock) {
>>              String results[] =new String[instanceListeners.length + 1];
>>              for (int i = 0; i < instanceListeners.length; i++)
>>                  results[i] = instanceListeners[i];
>> @@ -2456,7 +2477,7 @@
>>       */
>>      public void addSecurityRole(String role) {
>>  
>> -        synchronized (securityRoles) {
>> +        synchronized (securityRolesLock) {
>>              String results[] =new String[securityRoles.length + 1];
>>              for (int i = 0; i < securityRoles.length; i++)
>>                  results[i] = securityRoles[i];
>> @@ -2507,7 +2528,7 @@
>>                  (sm.getString("standardContext.servletMap.pattern",
>> pattern));
>>  
>>          // Add this mapping to our registered set
>> -        synchronized (servletMappings) {
>> +        synchronized (servletMappingsLock) {
>>              String name2 = servletMappings.get(pattern);
>>              if (name2 != null) {
>>                  // Don't allow more than one servlet on the same pattern
>> @@ -2551,7 +2572,7 @@
>>       */
>>      public void addWatchedResource(String name) {
>>  
>> -        synchronized (watchedResources) {
>> +        synchronized (watchedResourcesLock) {
>>              String results[] = new String[watchedResources.length + 1];
>>              for (int i = 0; i < watchedResources.length; i++)
>>                  results[i] = watchedResources[i];
>> @@ -2570,7 +2591,7 @@
>>       */
>>      public void addWelcomeFile(String name) {
>>  
>> -        synchronized (welcomeFiles) {
>> +        synchronized (welcomeFilesLock) {
>>              // Welcome files from the application deployment descriptor
>>              // completely replace those from the default conf/web.xml
>> file
>>              if (replaceWelcomeFiles) {
>> @@ -2597,7 +2618,7 @@
>>       */
>>      public void addWrapperLifecycle(String listener) {
>>  
>> -        synchronized (wrapperLifecycles) {
>> +        synchronized (wrapperLifecyclesLock) {
>>              String results[] =new String[wrapperLifecycles.length + 1];
>>              for (int i = 0; i < wrapperLifecycles.length; i++)
>>                  results[i] = wrapperLifecycles[i];
>> @@ -2617,7 +2638,7 @@
>>       */
>>      public void addWrapperListener(String listener) {
>>  
>> -        synchronized (wrapperListeners) {
>> +        synchronized (wrapperListenersLock) {
>>              String results[] =new String[wrapperListeners.length + 1];
>>              for (int i = 0; i < wrapperListeners.length; i++)
>>                  results[i] = wrapperListeners[i];
>> @@ -2649,7 +2670,7 @@
>>              wrapper = new StandardWrapper();
>>          }
>>  
>> -        synchronized (instanceListeners) {
>> +        synchronized (instanceListenersLock) {
>>              for (int i = 0; i < instanceListeners.length; i++) {
>>                  try {
>>                      Class<?> clazz =
>> Class.forName(instanceListeners[i]);
>> @@ -2663,7 +2684,7 @@
>>              }
>>          }
>>  
>> -        synchronized (wrapperLifecycles) {
>> +        synchronized (wrapperLifecyclesLock) {
>>              for (int i = 0; i < wrapperLifecycles.length; i++) {
>>                  try {
>>                      Class<?> clazz =
>> Class.forName(wrapperLifecycles[i]);
>> @@ -2678,7 +2699,7 @@
>>              }
>>          }
>>  
>> -        synchronized (wrapperListeners) {
>> +        synchronized (wrapperListenersLock) {
>>              for (int i = 0; i < wrapperListeners.length; i++) {
>>                  try {
>>                      Class<?> clazz = Class.forName(wrapperListeners[i]);
>> @@ -2713,7 +2734,9 @@
>>       */
>>      public ApplicationParameter[] findApplicationParameters() {
>>  
>> -        return (applicationParameters);
>> +        synchronized (applicationParametersLock) {
>> +            return (applicationParameters);
>> +        }
>>  
>>      }
>>  
>> @@ -2829,7 +2852,9 @@
>>       */
>>      public String[] findInstanceListeners() {
>>  
>> -        return (instanceListeners);
>> +        synchronized (instanceListenersLock) {
>> +            return (instanceListeners);
>> +        }
>>  
>>      }
>>  
>> @@ -2987,7 +3012,7 @@
>>       */
>>      public boolean findSecurityRole(String role) {
>>  
>> -        synchronized (securityRoles) {
>> +        synchronized (securityRolesLock) {
>>              for (int i = 0; i < securityRoles.length; i++) {
>>                  if (role.equals(securityRoles[i]))
>>                      return (true);
>> @@ -3004,7 +3029,9 @@
>>       */
>>      public String[] findSecurityRoles() {
>>  
>> -        return (securityRoles);
>> +        synchronized (securityRolesLock) {
>> +            return (securityRoles);
>> +        }
>>  
>>      }
>>  
>> @@ -3017,7 +3044,7 @@
>>       */
>>      public String findServletMapping(String pattern) {
>>  
>> -        synchronized (servletMappings) {
>> +        synchronized (servletMappingsLock) {
>>              return (servletMappings.get(pattern));
>>          }
>>  
>> @@ -3030,7 +3057,7 @@
>>       */
>>      public String[] findServletMappings() {
>>  
>> -        synchronized (servletMappings) {
>> +        synchronized (servletMappingsLock) {
>>              String results[] = new String[servletMappings.size()];
>>              return
>>                 (servletMappings.keySet().toArray(results));
>> @@ -3113,7 +3140,7 @@
>>       */
>>      public boolean findWelcomeFile(String name) {
>>  
>> -        synchronized (welcomeFiles) {
>> +        synchronized (welcomeFilesLock) {
>>              for (int i = 0; i < welcomeFiles.length; i++) {
>>                  if (name.equals(welcomeFiles[i]))
>>                      return (true);
>> @@ -3129,7 +3156,9 @@
>>       * defined, a zero length array will be returned.
>>       */
>>      public String[] findWatchedResources() {
>> -        return watchedResources;
>> +        synchronized (watchedResourcesLock) {
>> +            return watchedResources;
>> +        }
>>      }
>>           @@ -3139,7 +3168,9 @@
>>       */
>>      public String[] findWelcomeFiles() {
>>  
>> -        return (welcomeFiles);
>> +        synchronized (welcomeFilesLock) {
>> +            return (welcomeFiles);
>> +        }
>>  
>>      }
>>  
>> @@ -3150,7 +3181,9 @@
>>       */
>>      public String[] findWrapperLifecycles() {
>>  
>> -        return (wrapperLifecycles);
>> +        synchronized (wrapperLifecyclesLock) {
>> +            return (wrapperLifecycles);
>> +        }
>>  
>>      }
>>  
>> @@ -3161,7 +3194,9 @@
>>       */
>>      public String[] findWrapperListeners() {
>>  
>> -        return (wrapperListeners);
>> +        synchronized (wrapperListenersLock) {
>> +            return (wrapperListeners);
>> +        }
>>  
>>      }
>>  
>> @@ -3220,7 +3255,7 @@
>>       */
>>      public void removeApplicationListener(String listener) {
>>  
>> -        synchronized (applicationListeners) {
>> +        synchronized (applicationListenersLock) {
>>  
>>              // Make sure this welcome file is currently present
>>              int n = -1;
>> @@ -3260,7 +3295,7 @@
>>       */
>>      public void removeApplicationParameter(String name) {
>>  
>> -        synchronized (applicationParameters) {
>> +        synchronized (applicationParametersLock) {
>>  
>>              // Make sure this parameter is currently present
>>              int n = -1;
>> @@ -3319,7 +3354,7 @@
>>       */
>>      public void removeConstraint(SecurityConstraint constraint) {
>>  
>> -        synchronized (constraints) {
>> +        synchronized (constraintsLock) {
>>  
>>              // Make sure this constraint is currently present
>>              int n = -1;
>> @@ -3399,7 +3434,7 @@
>>       */
>>      public void removeFilterMap(FilterMap filterMap) {
>>  
>> -        synchronized (filterMaps) {
>> +        synchronized (filterMapsLock) {
>>  
>>              // Make sure this filter mapping is currently present
>>              int n = -1;
>> @@ -3438,7 +3473,7 @@
>>       */
>>      public void removeInstanceListener(String listener) {
>>  
>> -        synchronized (instanceListeners) {
>> +        synchronized (instanceListenersLock) {
>>  
>>              // Make sure this welcome file is currently present
>>              int n = -1;
>> @@ -3550,7 +3585,7 @@
>>       */
>>      public void removeSecurityRole(String role) {
>>  
>> -        synchronized (securityRoles) {
>> +        synchronized (securityRolesLock) {
>>  
>>              // Make sure this security role is currently present
>>              int n = -1;
>> @@ -3589,7 +3624,7 @@
>>      public void removeServletMapping(String pattern) {
>>  
>>          String name = null;
>> -        synchronized (servletMappings) {
>> +        synchronized (servletMappingsLock) {
>>              name = servletMappings.remove(pattern);
>>          }
>>          Wrapper wrapper = (Wrapper) findChild(name);
>> @@ -3624,7 +3659,7 @@
>>       */
>>      public void removeWatchedResource(String name) {
>>          -        synchronized (watchedResources) {
>> +        synchronized (watchedResourcesLock) {
>>  
>>              // Make sure this watched resource is currently present
>>              int n = -1;
>> @@ -3661,7 +3696,7 @@
>>       */
>>      public void removeWelcomeFile(String name) {
>>  
>> -        synchronized (welcomeFiles) {
>> +        synchronized (welcomeFilesLock) {
>>  
>>              // Make sure this welcome file is currently present
>>              int n = -1;
>> @@ -3701,7 +3736,7 @@
>>      public void removeWrapperLifecycle(String listener) {
>>  
>>  
>> -        synchronized (wrapperLifecycles) {
>> +        synchronized (wrapperLifecyclesLock) {
>>  
>>              // Make sure this welcome file is currently present
>>              int n = -1;
>> @@ -3740,7 +3775,7 @@
>>      public void removeWrapperListener(String listener) {
>>  
>>  
>> -        synchronized (wrapperListeners) {
>> +        synchronized (wrapperListenersLock) {
>>  
>>              // Make sure this welcome file is currently present
>>              int n = -1;
>> @@ -4701,7 +4736,9 @@
>>          // Notify our interested LifecycleListeners
>>          lifecycle.fireLifecycleEvent(DESTROY_EVENT, null);
>>  
>> -        instanceListeners = new String[0];
>> +        synchronized (instanceListenersLock) {
>> +            instanceListeners = new String[0];
>> +        }
>>  
>>      }
>>     
>> Modified: tomcat/trunk/java/org/apache/catalina/core/StandardHost.java
>> URL:
>> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardHost.java?rev=763298&r1=763297&r2=763298&view=diff
>>
>> ==============================================================================
>>
>> --- tomcat/trunk/java/org/apache/catalina/core/StandardHost.java
>> (original)
>> +++ tomcat/trunk/java/org/apache/catalina/core/StandardHost.java Wed
>> Apr  8 16:08:42 2009
>> @@ -72,6 +72,8 @@
>>       * The set of aliases for this Host.
>>       */
>>      private String[] aliases = new String[0];
>> +    +    private final Object aliasesLock = new Object();
>>  
>>  
>>      /**
>> @@ -514,20 +516,19 @@
>>  
>>          alias = alias.toLowerCase();
>>  
>> -        // Skip duplicate aliases
>> -        for (int i = 0; i < aliases.length; i++) {
>> -            if (aliases[i].equals(alias))
>> -                return;
>> +        synchronized (aliasesLock) {
>> +            // Skip duplicate aliases
>> +            for (int i = 0; i < aliases.length; i++) {
>> +                if (aliases[i].equals(alias))
>> +                    return;
>> +            }
>> +            // Add this alias to the list
>> +            String newAliases[] = new String[aliases.length + 1];
>> +            for (int i = 0; i < aliases.length; i++)
>> +                newAliases[i] = aliases[i];
>> +            newAliases[aliases.length] = alias;
>> +            aliases = newAliases;
>>          }
>> -
>> -        // Add this alias to the list
>> -        String newAliases[] = new String[aliases.length + 1];
>> -        for (int i = 0; i < aliases.length; i++)
>> -            newAliases[i] = aliases[i];
>> -        newAliases[aliases.length] = alias;
>> -
>> -        aliases = newAliases;
>> -
>>          // Inform interested listeners
>>          fireContainerEvent(ADD_ALIAS_EVENT, alias);
>>  
>> @@ -556,7 +557,9 @@
>>       */
>>      public String[] findAliases() {
>>  
>> -        return (this.aliases);
>> +        synchronized (aliasesLock) {
>> +            return (this.aliases);
>> +        }
>>  
>>      }
>>  
>> @@ -631,7 +634,7 @@
>>  
>>          alias = alias.toLowerCase();
>>  
>> -        synchronized (aliases) {
>> +        synchronized (aliasesLock) {
>>  
>>              // Make sure this alias is currently present
>>              int n = -1;
>> @@ -766,7 +769,9 @@
>>       }
>>  
>>      public String[] getAliases() {
>> -        return aliases;
>> +        synchronized (aliasesLock) {
>> +            return aliases;
>> +        }
>>      }
>>  
>>      private boolean initialized=false;
>>
>> Modified:
>> tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java
>> URL:
>> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java?rev=763298&r1=763297&r2=763298&view=diff
>>
>> ==============================================================================
>>
>> ---
>> tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java
>> (original)
>> +++
>> tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java
>> Wed Apr  8 16:08:42 2009
>> @@ -41,6 +41,8 @@
>>  {
>>      protected static final MemberImpl[] EMPTY_MEMBERS = new
>> MemberImpl[0];
>>      +    private final Object membersLock = new Object();
>> +         /**
>>       * The name of this membership, has to be the same as the name
>> for the local
>>       * member
>> @@ -63,7 +65,7 @@
>>      protected Comparator<Member> memberComparator = new
>> MemberComparator();
>>  
>>      public Object clone() {
>> -        synchronized (members) {
>> +        synchronized (membersLock) {
>>              Membership clone = new Membership(local, memberComparator);
>>              clone.map = (HashMap<MemberImpl, MbrEntry>) map.clone();
>>              clone.members = new MemberImpl[members.length];
>> @@ -139,7 +141,7 @@
>>       * @param member The member to add
>>       */
>>      public synchronized MbrEntry addMember(MemberImpl member) {
>> -      synchronized (members) {
>> +      synchronized (membersLock) {
>>            MbrEntry entry = new MbrEntry(member);
>>            if (!map.containsKey(member) ) {
>>                map.put(member, entry);
>> @@ -160,7 +162,7 @@
>>       */
>>      public void removeMember(MemberImpl member) {
>>          map.remove(member);
>> -        synchronized (members) {
>> +        synchronized (membersLock) {
>>              int n = -1;
>>              for (int i = 0; i < members.length; i++) {
>>                  if (members[i] == member || members[i].equals(member)) {
>>
>> Modified: tomcat/trunk/java/org/apache/catalina/util/InstanceSupport.java
>> URL:
>> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/InstanceSupport.java?rev=763298&r1=763297&r2=763298&view=diff
>>
>> ==============================================================================
>>
>> --- tomcat/trunk/java/org/apache/catalina/util/InstanceSupport.java
>> (original)
>> +++ tomcat/trunk/java/org/apache/catalina/util/InstanceSupport.java
>> Wed Apr  8 16:08:42 2009
>> @@ -64,6 +64,8 @@
>>       * The set of registered InstanceListeners for event notifications.
>>       */
>>      private InstanceListener listeners[] = new InstanceListener[0];
>> +    +    private final Object listenersLock = new Object(); // Lock
>> object for changes to listeners
>>  
>>  
>>      /**
>> @@ -95,7 +97,7 @@
>>       */
>>      public void addInstanceListener(InstanceListener listener) {
>>  
>> -      synchronized (listeners) {
>> +      synchronized (listenersLock) {
>>            InstanceListener results[] =
>>              new InstanceListener[listeners.length + 1];
>>            for (int i = 0; i < listeners.length; i++)
>> @@ -312,7 +314,7 @@
>>       */
>>      public void removeInstanceListener(InstanceListener listener) {
>>  
>> -        synchronized (listeners) {
>> +        synchronized (listenersLock) {
>>              int n = -1;
>>              for (int i = 0; i < listeners.length; i++) {
>>                  if (listeners[i] == listener) {
>>
>> Modified:
>> tomcat/trunk/java/org/apache/catalina/util/LifecycleSupport.java
>> URL:
>> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/LifecycleSupport.java?rev=763298&r1=763297&r2=763298&view=diff
>>
>> ==============================================================================
>>
>> --- tomcat/trunk/java/org/apache/catalina/util/LifecycleSupport.java
>> (original)
>> +++ tomcat/trunk/java/org/apache/catalina/util/LifecycleSupport.java
>> Wed Apr  8 16:08:42 2009
>> @@ -66,6 +66,8 @@
>>       * The set of registered LifecycleListeners for event notifications.
>>       */
>>      private LifecycleListener listeners[] = new LifecycleListener[0];
>> +    +    private final Object listenersLock = new Object(); // Lock
>> object for changes to listeners
>>  
>>  
>>      // ---------------------------------------------------------
>> Public Methods
>> @@ -78,7 +80,7 @@
>>       */
>>      public void addLifecycleListener(LifecycleListener listener) {
>>  
>> -      synchronized (listeners) {
>> +      synchronized (listenersLock) {
>>            LifecycleListener results[] =
>>              new LifecycleListener[listeners.length + 1];
>>            for (int i = 0; i < listeners.length; i++)
>> @@ -126,7 +128,7 @@
>>       */
>>      public void removeLifecycleListener(LifecycleListener listener) {
>>  
>> -        synchronized (listeners) {
>> +        synchronized (listenersLock) {
>>              int n = -1;
>>              for (int i = 0; i < listeners.length; i++) {
>>                  if (listeners[i] == listener) {
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
>> For additional commands, e-mail: dev-h...@tomcat.apache.org
>>
>>
>>   
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: dev-h...@tomcat.apache.org
> 



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

Reply via email to