Gap Buffer based AbstractStringBuilder implementation

Thomas Hawtin Thomas.Hawtin at Sun.COM
Sun Nov 22 21:50:02 UTC 2009

Osvaldo Pinali Doederlein wrote:

>     public String toStringShared() {
>         // createShared() is a package-protected helper/ctor
>         String ret = String.createShared(value, 0, count);
>         // Reset value, so evil user can't abuse the buffer to change 
> the String.
>         value = EMPTY;
>         count = 0;
>         return ret;
>     }
>     private static final char[] EMPTY = new char[0];
> This solution should be safe, without need of escape/alias analysis, 
> because StringBuilder and StringBuffer don't have any methods that 
> return a new mutable object that shares the same char[]. The only APIs 
> that aliases the buffer is subSequence(), but this returns a 
> CharSequence which is a read-only object.

You will need to look at the Java Memory Model (JMM) (which is not 
sequentially consistent (SC)) to understand why this sort of thing can 
never work without adding synchronized/volatile to String. You can 
synchronize StringBuffer as much as you like, but it still wont work.

Tom Hawtin

More information about the core-libs-dev mailing list