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