In un'applicazione Web di produzione, i miei colleghi programmatori hanno usato StringBuffer ovunque. Ora mi occupo dello sviluppo e delle correzioni dell'applicazione. Dopo aver letto StringBuilder e StringBuffer ho deciso di sostituire tutto il codice StringBuffer con StringBuilder perché non abbiamo bisogno della sicurezza dei thread nei nostri bean di dati.
Ad esempio: (In ogni bean di dati posso vedere l'uso di StringBuffer)
@Override
public String toString() {
StringBuffer sb = new StringBuffer();// replace it from StringBuilder
sb.append(" ABCD : ").append(abcd);
sb.append(", EFGH : ").append(efgh);
sb.append(", IJKL : ").append(ijkl);
}
Creiamo bean di dati separati per ogni sessione / richiesta. Una sessione viene utilizzata da un singolo utente a cui nessun altro utente può accedervi.
Devo considerare altri punti prima di migrare?
Se esiste un singolo thread (nessun thread in attesa / nessun nuovo thread cercherà il blocco degli oggetti), si comporta allo stesso modo con StringBuffer o StringBuilder. So che nel caso di StringBuffer, ci vuole tempo per prendere il blocco degli oggetti, ma voglio sapere se c'è qualche differenza di prestazioni tra loro tranne il blocco / rilascio del blocco degli oggetti.
StringBuffer
. Non ho mai visto un codice del genere, ma sono quasi sicuro che sia una cattiva progettazione da una prospettiva multithreading. Dal momento che penso che sincronizzare il thread lungo l' StringBuffer
interfaccia sia una cattiva idea, penso che questa classe non dovrebbe esistere e si dovrebbe sempre usare StringBuilder
. Come altri già menzionati, StringBuffer
esiste per ragioni storiche.
sb
come variabile locale come nel tuo esempio, la sicurezza del thread non ha alcuna importanza. Anche se un migliaio di thread entrassero contemporaneamente nel metodo, ognuno avrebbe il proprio stack di chiamate con le proprie variabili locali. StringBuilders non interferirebbe mai tra loro.