Poiché StringBuffer
è thread-safe, può essere tranquillamente pubblicato. Si consideri il costruttore pubblico di StringBuffer
(sources):Come pubblicare StringBuffer in modo sicuro?
public StringBuffer() {
super(16);
}
dove super(16)
designa questo:
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
dove il valore dichiarato come
char[] value;
DOMANDA: Come pubblicare StringBuffer
in sicurezza?
Ho la seguente classe:
public class Holder{
public final StringBuffer sb = new StringBuffer();
}
può essere considerato come sicuro-pubblicazione? Penso, non può.
final
garantisce che vedremo un nuovo valore del riferimento sb
. Tuttavia, la scrittura nello stato interno di sb
all'interno di AbstractStringBuilder(int capacity)
non è sincronizzata. Quindi non c'è l'ordine happens-before
che a sua volta significa che leggere da value
si verifica quando si invoca sb.append(2);
e si scrive in value
nel costruttore sono racy.
Potete aiutarmi a capire questo? Forse ho perso qualcosa ...
Intende per 'sb' essere una variabile di istanza o dovrebbe essere statica? – Paolo
Se si desidera un provider thread-safe di un testo/stringa che cambia a volte, quindi utilizzare ['AtomicReference'] (https://docs.oracle.com/javase/8/docs/api/java/util/ concurrent/atomico/AtomicReference.html). StringBuffer è per l'aggiunta simultanea ad esso, un caso d'uso raro. –
@Paolo No, è esattamente un'istanza varialbe. L'inizializzazione statica si è verificata durante l'inizializzazione di una classe che comporta il blocco inter-JVM, che inturns garantisce la coerenza della memoria. –