You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2009/03/17 21:54:52 UTC

svn commit: r755391 - /commons/proper/lang/trunk/src/java/org/apache/commons/lang/exception/ExceptionUtils.java

Author: sebb
Date: Tue Mar 17 20:54:52 2009
New Revision: 755391

URL: http://svn.apache.org/viewvc?rev=755391&view=rev
Log:
LANG-369 - must use fixed object as lock target

Modified:
    commons/proper/lang/trunk/src/java/org/apache/commons/lang/exception/ExceptionUtils.java

Modified: commons/proper/lang/trunk/src/java/org/apache/commons/lang/exception/ExceptionUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/apache/commons/lang/exception/ExceptionUtils.java?rev=755391&r1=755390&r2=755391&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/java/org/apache/commons/lang/exception/ExceptionUtils.java (original)
+++ commons/proper/lang/trunk/src/java/org/apache/commons/lang/exception/ExceptionUtils.java Tue Mar 17 20:54:52 2009
@@ -28,6 +28,9 @@
 import java.util.List;
 import java.util.StringTokenizer;
 
+import net.jcip.annotations.GuardedBy;
+import net.jcip.annotations.ThreadSafe;
+
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.ClassUtils;
 import org.apache.commons.lang.NullArgumentException;
@@ -46,6 +49,7 @@
  * @since 1.0
  * @version $Id$
  */
+@ThreadSafe
 public class ExceptionUtils {
     
     /**
@@ -56,9 +60,13 @@
      */
     static final String WRAPPED_MARKER = " [wrapped] ";
 
+    // Lock object for CAUSE_METHOD_NAMES
+    private static final Object CAUSE_METHOD_NAMES_LOCK = new Object();
+    
     /**
      * <p>The names of methods commonly used to access a wrapped exception.</p>
      */
+    @GuardedBy("CAUSE_METHOD_NAMES_LOCK")
     private static String[] CAUSE_METHOD_NAMES = {
         "getCause",
         "getNextException",
@@ -123,7 +131,7 @@
         if (StringUtils.isNotEmpty(methodName) && !isCauseMethodName(methodName)) {            
             List<String> list = getCauseMethodNameList();
             if (list.add(methodName)) {
-                synchronized(CAUSE_METHOD_NAMES) {
+                synchronized(CAUSE_METHOD_NAMES_LOCK) {
                     CAUSE_METHOD_NAMES = toArray(list);
                 }
             }
@@ -142,7 +150,7 @@
         if (StringUtils.isNotEmpty(methodName)) {
             List<String> list = getCauseMethodNameList();
             if (list.remove(methodName)) {
-                synchronized(CAUSE_METHOD_NAMES) {
+                synchronized(CAUSE_METHOD_NAMES_LOCK) {
                     CAUSE_METHOD_NAMES = toArray(list);
                 }
             }
@@ -222,7 +230,7 @@
      * @return {@link #CAUSE_METHOD_NAMES} as a List.
      */
     private static ArrayList<String> getCauseMethodNameList() {
-        synchronized(CAUSE_METHOD_NAMES) {
+        synchronized(CAUSE_METHOD_NAMES_LOCK) {
             return new ArrayList<String>(Arrays.asList(CAUSE_METHOD_NAMES));
         }
     }
@@ -237,7 +245,7 @@
      * @since 2.1
      */
     public static boolean isCauseMethodName(String methodName) {
-        synchronized(CAUSE_METHOD_NAMES) {
+        synchronized(CAUSE_METHOD_NAMES_LOCK) {
             return ArrayUtils.indexOf(CAUSE_METHOD_NAMES, methodName) >= 0;
         }
     }
@@ -274,7 +282,7 @@
      * @since 1.0
      */
     public static Throwable getCause(Throwable throwable) {
-        synchronized(CAUSE_METHOD_NAMES) {
+        synchronized(CAUSE_METHOD_NAMES_LOCK) {
             return getCause(throwable, CAUSE_METHOD_NAMES);
         }
     }
@@ -304,7 +312,7 @@
         Throwable cause = getCauseUsingWellKnownTypes(throwable);
         if (cause == null) {
             if (methodNames == null) {
-                synchronized(CAUSE_METHOD_NAMES) {
+                synchronized(CAUSE_METHOD_NAMES_LOCK) {
                     methodNames = CAUSE_METHOD_NAMES;
                 }
             }
@@ -463,7 +471,7 @@
         }
 
         Class<? extends Throwable> cls = throwable.getClass();
-        synchronized(CAUSE_METHOD_NAMES) {
+        synchronized(CAUSE_METHOD_NAMES_LOCK) {
             for (int i = 0, isize = CAUSE_METHOD_NAMES.length; i < isize; i++) {
                 try {
                     Method method = cls.getMethod(CAUSE_METHOD_NAMES[i], (Class[]) null);