Beschleunigung durch Synchronisieren bei StringBuffer?

takidoso

Erfahrenes Mitglied
Halli und Hallo,
ich habe mal von jemandem erzählt bekommen, dass, wenn man z.B. mit StringBuffern arberitet die SstringBuffer-Statements in einen synchronize-Block setzen soll, da somit die synchronisierung der einzelnen statements nicht extra ausgeführt und somit Rechenzeit gespart wird. Stimmt das? Ist Java tatsächlich so schlau und würde die synchronize-statements innerhalb der aufgerufenen StringBuffer-methoden ignorieren
Hat mich etwas in Erstaunen versetzt.
kann das jemand bestätigen?
hier ein Code Beispiel:
Code:
final StringBuffer sb = new StringBuffer();
synchronized (sb)
{
    sb.append("lala1");
    sb.append("lala2");
    sb.append("lala3");

}
 
Hallo,

davon hab ich noch nie was gehört...
Wenn der StringBuffer nur lokal (beispielsweise innerhalb einer Methode) erzeugt wird braucht man
gar nicht zu sychronisieren da lokale Variablen immer nur für den Thread "sichtbar" sind der den entsprechenden Codeblock ausführt. Deshalb kann man auch StringBuffer die nur lokal deklariert / initialisiert / verwendet werden auch ohne bedenken durch die unsychronisierte StringBuilder Variante ersetzen.

Gruß Tom
 
Nochmal kurz zur Modivation, es geht hier weniger um Threadsicherheit, sondern um (angebliche) Beschleunigung weil das Synchronisieren innerhalb der appends angeblich wegfallen soll.
Also ich selbst kann mir auch nicht wirklich vorstellen, dass damit die Ausführung beschleunigt wird, weil "angeblich" die synchronized statements innerhalb der in diesem Fall append()-Methoden ausgelassen werden. zum anderen finde ich den Code etwas verunstaltet.
Also werde ich das, wenn nicht jemand nicht noch irgendjemand dazu etwas Bestätigendes weiß unter die Rubrik Fabeln und Sagen schieben :-D
 
Also ich hab mal alle drei Varianten (StringBuffer synchronisiert, StringBuffer unsynchronisiert sowie StringBuilder) durchprobiert und mir das Laufzeitverhalten ausgeben lassen.

Ergebniss: Es gibt sogut wie keinerlei Unterschiede (Laufzeitabweichungen unter 1%, wobei die Stringbuilder-Version am schnellsten ist) zwischen den einzelnen Varianten.


Gruß, Manuel
 
Ergebniss: Es gibt sogut wie keinerlei Unterschiede (Laufzeitabweichungen unter 1%, wobei die Stringbuilder-Version am schnellsten ist) zwischen den einzelnen Varianten.

Hallo Manuel,
war das knapp 1% nun schneller bei der zusätzlichen Synchronisierung oder ohne sie?
 
Zwischen der synchronisierten und der unsynchonisierten Variante konnte ich nach ca. 15 Durchläufen keinen klaren Unterschied erkennen - mal war die synchronisierte Version schneller, mal die unsynchronisierte. Die Differenz lag dabei immer im Promille-Bereich.

Gruss, Manuel
 
Zurück