Rich, I think there might be a threading problem with this change... The use of for loops with counters means that we are not protected by the CopyOnWriteArrayList to underlying changes to the array - i.e. if someone does a remove() between the start of the last iteration of one of your for loops and the .get() executing, I think the .get() will cause an IndexOutOfBoundsException
I think this can be remedied by using the CopyOnWriteArrayList iterator which uses a point in time view of the ArrayList... Does that sound right? David On Wed, May 21, 2008 at 1:45 AM, <[EMAIL PROTECTED]> wrote: > Author: scheu > Date: Tue May 20 17:45:54 2008 > New Revision: 658516 > > URL: http://svn.apache.org/viewvc?rev=658516&view=rev > Log: > Use CopyOnWriteArrayList to increase performance > Contributor:David Strite > The messageContextListener object is seldom updated. Therefore using a > CopyOnWriteArrayList avoids unnecessary synchronization. > > Modified: > > webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisService.java > > Modified: > webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisService.java > URL: > http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisService.java?rev=658516&r1=658515&r2=658516&view=diff > ============================================================================== > --- > webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisService.java > (original) > +++ > webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisService.java > Tue May 20 17:45:54 2008 > @@ -73,6 +73,7 @@ > import java.net.URL; > import java.security.PrivilegedAction; > import java.util.*; > +import java.util.concurrent.CopyOnWriteArrayList; > > /** > * Class AxisService > @@ -252,7 +253,8 @@ > private String bindingName; > > // List of MessageContextListeners that listen for events on the > MessageContext > - private ArrayList messageContextListeners = new ArrayList(); > + private CopyOnWriteArrayList<MessageContextListener> > messageContextListeners = > + new CopyOnWriteArrayList<MessageContextListener>(); > > // names list keep to preserve the parameter order > private List operationsNameList; > @@ -2979,9 +2981,7 @@ > * @param scl > */ > public void addMessageContextListener(MessageContextListener scl) { > - synchronized (messageContextListeners) { > - messageContextListeners.add(scl); > - } > + messageContextListeners.add(scl); > } > > /** > @@ -2989,9 +2989,7 @@ > * @param scl > */ > public void removeMessageContextListener(MessageContextListener scl) { > - synchronized (messageContextListeners) { > - messageContextListeners.remove(scl); > - } > + messageContextListeners.remove(scl); > } > > /** > @@ -2999,11 +2997,9 @@ > * @return true if ServiceContextLister is in the list > */ > public boolean hasMessageContextListener(Class cls) { > - synchronized (messageContextListeners) { > - for (int i=0; i<messageContextListeners.size(); i++) { > - if (messageContextListeners.get(i).getClass() == cls) { > - return true; > - } > + for (int i=0; i<messageContextListeners.size(); i++) { > + if (messageContextListeners.get(i).getClass() == cls) { > + return true; > } > } > return false; > @@ -3015,11 +3011,8 @@ > * @param mc MessageContext > */ > public void attachServiceContextEvent(ServiceContext sc, MessageContext > mc) { > - synchronized (messageContextListeners) { > - for (int i=0; i<messageContextListeners.size(); i++) { > - ((MessageContextListener) messageContextListeners.get(i)). > - attachServiceContextEvent(sc, mc); > - } > + for (int i=0; i<messageContextListeners.size(); i++) { > + messageContextListeners.get(i).attachServiceContextEvent(sc, mc); > } > } > > @@ -3029,11 +3022,8 @@ > * @param mc MessageContext > */ > public void attachEnvelopeEvent(MessageContext mc) { > - synchronized (messageContextListeners) { > - for (int i=0; i<messageContextListeners.size(); i++) { > - ((MessageContextListener) messageContextListeners.get(i)). > - attachEnvelopeEvent(mc); > - } > + for (int i=0; i<messageContextListeners.size(); i++) { > + messageContextListeners.get(i).attachEnvelopeEvent(mc); > } > } > } > > > -- David Illsley - IBM Web Services Development --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
