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
