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.
quelle
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.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 derStringBuffer
Schnittstelle eine schlechte Idee ist, denke ich, dass diese Klasse nicht existieren sollte und man sie immer verwenden sollteStringBuilder
. Wie bereits erwähnt,StringBuffer
besteht aus historischen Gründen.Antworten:
Der einzige Unterschied zwischen den beiden ist die in StringBuffer verwendete Synchronisation. Der Aufwand für die Synchronisation ist im großen Rahmen der Dinge nicht groß, aber im Vergleich zu den StringBuilder-Methoden, die sie nicht haben, erheblich. Die JVM erledigt Arbeiten, die sie sonst nicht erledigen müsste - insbesondere mit nur einem Thread usw.
Wenn Ihr Code funktioniert und die Leute sich nicht über die Leistung beschweren, würde ich mir darüber keine Sorgen machen. Sie werden nicht viel für Ihr Geld bekommen. Wenn Sie jedoch neuen Code schreiben oder Code aktualisieren, der StringBuffer verwendet, empfiehlt es sich, diese gleichzeitig in StringBuilder zu konvertieren.
quelle
StringBuffer
ist das wahrscheinlich auch nicht ausreichend! Es garantiert, dass es nicht bremst, aber die Position, an der Sie anhängen, kann nicht einfach gesteuert werden, wenn mehrere Threads gleichzeitig darauf zugreifen, sodass eine weitere externe Synchronisierung erforderlich wäre.StringBuilder wurde zu einem Zeitpunkt hinzugefügt (Java 1.5), um ein besserer und schnellerer StringBuffer zu sein, und der Compiler verwendet ihn unter der Haube, um den
+
Operator auf Strings zu implementieren .Dies bedeutet, dass Sie mit StringBuilder Ihren Code nicht älter als zum Zeitpunkt der Einführung der Klasse auf JVMs ausführen können. Dies wäre für uns noch eine Weile ein Problem. Wenn Sie immer auf dem neuesten Stand sind, brauchen Sie sich nicht darum zu kümmern.
Ich würde den Optimierungsprozess, den Sie durchlaufen, aus den folgenden Gründen nicht durchlaufen.
quelle
Outside tight loops the advantage is negligible...