Since StringBuffer is thread safe it can safely be published. Consider the public constructor of StringBuffer ( sources ):
public StringBuffer() {
super(16);
}
where super(16) designates this one:
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
where value declared as
char[] value;
QUESTION: How to publish StringBuffer safely?
I've got the following class:
public class Holder{
public final StringBuffer sb = new StringBuffer();
}
Can it be considered as safe-publication? I think, it cannot.
final guarantees that we'll see a fresh value of the reference sb. But writing to the sb's internal state within AbstractStringBuilder(int capacity) is not synchronized. Therefore there's no happens-before order which in turn means that read from value occured when invoking sb.append(2); and writing to value in the constructor are racy.
Can you help to understand this? Maybe I missed something...