You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by sc...@apache.org on 2008/05/21 02:45:54 UTC

svn commit: r658516 - /webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisService.java

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);
         }
     }
 }



Re: svn commit: r658516 - /webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisService.java

Posted by David Illsley <da...@gmail.com>.
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,  <sc...@apache.org> 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: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org