In einer Produktionswebanwendung verwendeten meine Programmierkollegen überall StringBuffer. Jetzt kümmere ich mich um die Anwendungsentwicklung und Korrekturen. Nach dem Lesen von StringBuilder und StringBuffer habe ich beschlossen, den gesamten StringBuffer-Code durch StringBuilder zu ersetzen, da in unseren Data Beans keine Threadsicherheit erforderlich ist.
Zum Beispiel: (In jeder Datenbohne kann ich die Verwendung von StringBuffer sehen)
@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);
}
Wir erstellen für jede Sitzung / Anfrage ein eigenes Data Bean. Eine Sitzung wird von einem einzelnen Benutzer verwendet, auf den kein anderer Benutzer zugreifen kann.
Sollte ich vor der Migration andere Punkte berücksichtigen?
Wenn es einen einzelnen Thread gibt (keine wartenden Threads / kein neuer Thread sucht nach einer Objektsperre), wird die gleiche Leistung wie bei StringBuffer oder StringBuilder erzielt. Ich weiß, dass es im Fall von StringBuffer einige Zeit dauert, bis die Objektsperre aktiviert ist, aber ich möchte wissen, ob es Leistungsunterschiede zwischen ihnen gibt, mit Ausnahme des Haltens / Aufhebens der Objektsperre.
StringBuffer
. Ich habe noch nie so einen Code gesehen, aber ich bin mir fast sicher, dass es sich aus Multithreading-Sicht um ein schlechtes Design handelt. Da ich denke, dass das Synchronisieren von Threads entlang der StringBuffer
Schnittstelle eine schlechte Idee ist, denke ich, dass diese Klasse nicht existieren sollte und man sie immer verwenden sollte StringBuilder
. Wie bereits erwähnt, StringBuffer
besteht aus historischen Gründen.
sb
wie in Ihrem Beispiel eine lokale Variable verwenden, spielt die Thread-Sicherheit keine Rolle. Selbst wenn tausend Threads gleichzeitig in die Methode eingingen, hätte jeder einen eigenen Aufrufstapel mit eigenen lokalen Variablen. Die StringBuilder würden sich niemals gegenseitig stören.