Dlaczego warto używać StringBuilder? StringBuffer może pracować z wieloma wątkami, a także z jednym wątkiem?

Załóżmy, że nasza aplikacja ma tylko jeden wątek. i używamy StringBuffer to w czym problem?

Chodzi mi o to, że jeśli {[0] } potrafi obsługiwać wiele wątków poprzez synchronizację, to jaki jest problem z pracą z jednym wątkiem?

Dlaczego zamiast tego używać StringBuilder?

Author: Javascript is GOD, 2011-05-30

8 answers

StringBuffers są bezpieczne dla wątków, co oznacza, że mają zsynchronizowane metody Kontroli Dostępu, tak aby tylko jeden wątek mógł uzyskać dostęp do zsynchronizowanego kodu obiektu StringBuffer na raz. Tak więc obiekty StringBuffer są na ogół bezpieczne w środowisku wielowątkowym, w którym wiele wątków może próbować uzyskać dostęp do tego samego obiektu StringBuffer w tym samym czasie.

StringBuilder's Dostęp nie jest zsynchronizowany, więc nie jest bezpieczny dla wątków. Przez nie synchronizowanie, wydajność StringBuilder może być lepszy niż StringBuffer. Tak więc, jeśli pracujesz w środowisku jednowątkowym, użycie StringBuilder zamiast StringBuffer może spowodować zwiększenie wydajności. Dotyczy to również innych sytuacji, takich jak zmienna lokalna StringBuilder (czyli zmienna wewnątrz metody), w których tylko jeden wątek będzie miał dostęp do obiektu StringBuilder.

Więc wolę StringBuilder Ponieważ,

  • mały przyrost wydajności.
  • StringBuilder jest zamiennikiem drop-in 1: 1 dla Klasa StringBuffer.
  • StringBuilder nie jest zsynchronizowany z wątkami i dlatego działa lepiej na większości implementacji Javy.]}

Zobacz to:

 26
Author: Javascript is GOD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-30 09:21:41

StringBuilder powinien być (malutki) trochę szybszy, ponieważ nie jest zsynchronizowany (bezpieczny dla wątku).

Można zauważyć różnicę w naprawdę ciężkich aplikacjach.

Klasa StringBuilder powinna być zazwyczaj używana jako preferowana, ponieważ obsługuje wszystkie te same operacje, ale jest szybsza, ponieważ nie wykonuje żadnej synchronizacji.

Http://download.oracle.com/javase/6/docs/api/java/lang/StringBuffer.html

 7
Author: Bart Vangeneugden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-30 09:10:22

Używanie Stringbuffera w wielu wątkach jest prawie bezużyteczne i w rzeczywistości prawie nigdy się nie zdarza.

Rozważ następujące

Thread1: sb.append(key1).append("=").append(value1);
Thread2: sb.append(key2).append("=").append(value2);

Każdy dodatek jest zsynchronizowany, ale wątek może się pochylić w dowolnym momencie, więc możesz mieć dowolną z następujących kombinacji i więcej

key1=value1key2=value2
key1key2==value2value1
key2key1=value1=value2
key2=key1=value2value1

Można tego uniknąć, synchronizując całą linię na raz, ale to pokonuje punkt użycia StringBuffer zamiast StringBuilder.

Nawet jeśli masz prawidłowo zsynchronizowany Widok, to bardziej skomplikowane niż tworzenie lokalnej kopii wątku całej linii, np. StringBuilder i log linii naraz do klasy takiej jak Writer.

 4
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-30 11:26:04

StringBuffer nie jest źle w aplikacji jednowątkowej. Będzie działać tak samo dobrze jak StringBuilder.

Jedyną różnicą jest mały narzut dodany przez wszystkie zsynchronizowane metody, co nie przynosi korzyści w aplikacji jednowątkowej.

Moim zdaniem głównym powodem StringBuilder został wprowadzony jest to, że kompilator używa StringBuffer (a teraz StringBuilder), gdy kompiluje kod zawierający String konkatenację: w tych przypadkach synchronizacja jest nigdy konieczne i zastąpienie wszystkich tych miejsc niezsynchronizowanym StringBuilder może zapewnić niewielką poprawę wydajności.

 3
Author: Joachim Sauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-30 09:09:34

StringBuilder ma lepszą wydajność, ponieważ jego metody nie są zsynchronizowane.

Więc jeśli nie trzeba budować ciąg znaków jednocześnie (co i tak jest dość nietypowym scenariuszem), to nie ma potrzeby "płacić"za niepotrzebną synchronizację.

 2
Author: Andreas_D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-30 09:06:33

This will help u guys, Be Straight Builder jest szybszy niż bufor,

public class ConcatPerf {
        private static final int ITERATIONS = 100000;
        private static final int BUFFSIZE = 16;

        private void concatStrAdd() {
            System.out.print("concatStrAdd   -> ");
            long startTime = System.currentTimeMillis();
            String concat = new String("");
            for (int i = 0; i < ITERATIONS; i++) {
                concat += i % 10;
            }
            //System.out.println("Content: " + concat);
            long endTime = System.currentTimeMillis();
            System.out.print("length: " + concat.length());
            System.out.println(" time: " + (endTime - startTime));
        }

        private void concatStrBuff() {
            System.out.print("concatStrBuff  -> ");
            long startTime = System.currentTimeMillis();
            StringBuffer concat = new StringBuffer(BUFFSIZE);
            for (int i = 0; i < ITERATIONS; i++) {
                concat.append(i % 10);
            }
            long endTime = System.currentTimeMillis();
            //System.out.println("Content: " + concat);
            System.out.print("length: " + concat.length());
            System.out.println(" time: " + (endTime - startTime));
        }

        private void concatStrBuild() {
            System.out.print("concatStrBuild -> ");
            long startTime = System.currentTimeMillis();
            StringBuilder concat = new StringBuilder(BUFFSIZE);
            for (int i = 0; i < ITERATIONS; i++) {
                concat.append(i % 10);
            }
            long endTime = System.currentTimeMillis();
           // System.out.println("Content: " + concat);
            System.out.print("length: " + concat.length());
            System.out.println(" time: " + (endTime - startTime));
        }

        public static void main(String[] args) {
            ConcatPerf st = new ConcatPerf();
            System.out.println("Iterations: " + ITERATIONS);
            System.out.println("Buffer    : " + BUFFSIZE);

            st.concatStrBuff();
            st.concatStrBuild();
            st.concatStrAdd();
        }
    }

Output  

    run:
    Iterations: 100000
    Buffer    : 16
    concatStrBuff  -> length: 100000 time: 11
    concatStrBuild -> length: 100000 time: 4
    concatStrAdd   -> 
 0
Author: MyStack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-17 17:44:49

Manish, mimo że na Twojej instancji StringBuffer działa tylko jeden wątek, istnieje pewien narzut w pozyskiwaniu i zwalnianiu blokady monitora Na instancji StringBuffer za każdym razem, gdy wywoływana jest którakolwiek z jej metod. Dlatego StringBuilder jest preferowanym wyborem w środowisku pojedynczego wątku.

 0
Author: Praveen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-05 09:58:11

Istnieje ogromny koszt synchronizacji obiektów. Nie widzisz programu jako samodzielnej jednostki; nie jest to problem, gdy czytasz pojęcia i stosujesz je na małych programach, takich jak wspomniałeś w swoich szczegółach pytania, problemy pojawiają się, gdy chcemy skalować system. W takim przypadku program z pojedynczym wątkiem może być zależny od kilku innych metod/programów/jednostek, więc zsynchronizowane obiekty mogą powodować poważną złożoność programowania pod względem wydajności. Więc jeśli jesteś oczywiście, że nie ma potrzeby synchronizacji obiektu, powinieneś użyć StringBuilder, ponieważ jest to dobra praktyka programowania. Na koniec chcemy nauczyć się programowania, aby tworzyć skalowalne systemy o wysokiej wydajności, więc to właśnie powinniśmy zrobić!

 0
Author: Nikhil Arora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-10 18:13:47