RFR: 691423 - (str) Missing synchronization in java.lang.String#contentEquals(CharSequence)

Jim Gish jim.gish at oracle.com
Thu Jul 26 20:12:24 UTC 2012


Summary:  currently String.contentEquals( StringBuffer sb ) synchronizes 
on sb, but String.contentEquals( CharSequence cs ) does not sync when cs 
is a StringBuffer
Proposed change:  remove contentEquals( StringBuffer ) and have 
contentEquals( CharSequence ) do the checking and synchronize if the cs 
is a StringBuffer.
Note: I expect this will require CCC approval because of the removal of 
contentEquals( StringBuffer ).

Thanks,
    Jim

Proposed patch:
diff --git a/src/share/classes/java/lang/String.java 
b/src/share/classes/java/lang/String.java
--- a/src/share/classes/java/lang/String.java
+++ b/src/share/classes/java/lang/String.java
@@ -1,5 +1,5 @@
  /*
- * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights 
reserved.
+ * Copyright (c) 1994, 2012, Oracle and/or its affiliates. All rights 
reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
@@ -984,30 +984,26 @@
          return false;
      }

-    /**
-     * Compares this string to the specified {@code StringBuffer}.  The 
result
-     * is {@code true} if and only if this {@code String} represents 
the same
-     * sequence of characters as the specified {@code StringBuffer}.
-     *
-     * @param  sb
-     *         The {@code StringBuffer} to compare this {@code String} 
against
-     *
-     * @return  {@code true} if this {@code String} represents the same
-     *          sequence of characters as the specified {@code 
StringBuffer},
-     *          {@code false} otherwise
-     *
-     * @since  1.4
-     */
-    public boolean contentEquals(StringBuffer sb) {
-        synchronized (sb) {
-            return contentEquals((CharSequence) sb);
+    private boolean contentEquals(AbstractStringBuilder sb) {
+        char v1[] = value;
+        char v2[] = sb.getValue();
+        int i = 0;
+        int n = value.length;
+        while (n-- != 0) {
+            if (v1[i] != v2[i]) {
+                return false;
+            }
+            i++;
          }
+        return true;
      }

      /**
-     * Compares this string to the specified {@code CharSequence}.  The 
result
-     * is {@code true} if and only if this {@code String} represents 
the same
-     * sequence of char values as the specified sequence.
+     * Compares this string to the specified {@code CharSequence}.  The
+     * result is {@code true} if and only if this {@code String} 
represents the
+     * same sequence of char values as the specified sequence. Note 
that if the
+     * {@code CharSequence} is a {@code StringBuffer} then the method
+     * synchronizes on it.
       *
       * @param  cs
       *         The sequence to compare this {@code String} against
@@ -1023,16 +1019,13 @@
              return false;
          // Argument is a StringBuffer, StringBuilder
          if (cs instanceof AbstractStringBuilder) {
-            char v1[] = value;
-            char v2[] = ((AbstractStringBuilder) cs).getValue();
-            int i = 0;
-            int n = value.length;
-            while (n-- != 0) {
-                if (v1[i] != v2[i])
-                    return false;
-                i++;
+            if (cs instanceof StringBuffer) {
+                synchronized(cs) {
+                   return contentEquals((AbstractStringBuilder)cs);
+                }
+            } else {
+                return contentEquals((AbstractStringBuilder)cs);
              }
-            return true;
          }
          // Argument is a String
          if (cs.equals(this))



-- 
Jim Gish | Consulting Member of Technical Staff | +1.781.442.0304
Oracle Java Platform Group | Core Libraries Team
35 Network Drive
Burlington, MA 01803
jim.gish at oracle.com




More information about the core-libs-dev mailing list