--- old/src/share/classes/java/lang/StringBuffer.java 2013-05-20 01:31:51.535277882 -0400 +++ new/src/share/classes/java/lang/StringBuffer.java 2013-05-20 01:31:50.323209866 -0400 @@ -335,10 +335,8 @@ * @since 1.5 */ @Override - public StringBuffer append(CharSequence s) { - // Note, synchronization achieved via invocations of other StringBuffer methods after - // narrowing of s to specific type - // Ditto for toStringCache clearing + public synchronized StringBuffer append(CharSequence s) { + toStringCache = null; super.append(s); return this; } --- old/test/java/lang/StringBuffer/ToStringCache.java 2013-05-20 01:31:55.431496522 -0400 +++ new/test/java/lang/StringBuffer/ToStringCache.java 2013-05-20 01:31:54.203427608 -0400 @@ -22,7 +22,7 @@ */ /* @test - * @bug 8013395 + * @bug 8013395 8014814 * @summary Test StringBuffer.toString caching */ @@ -199,6 +199,28 @@ b = sb.toString(); checkUnequal(a, b); + // Extra checks that append(null) works correctly + + sb.append((String)null); + b = sb.toString(); + checkUnequal(a, b); + a = b; + + sb.append((StringBuffer)null); + b = sb.toString(); + checkUnequal(a, b); + a = b; + + sb.append((StringBuilder)null); + b = sb.toString(); + checkUnequal(a, b); + a = b; + + sb.append((CharSequence)null); + b = sb.toString(); + checkUnequal(a, b); + a = b; + // non-mutating methods // Reset to known value