Avatar billede fessoor Nybegynder
12. december 2006 - 18:07 Der er 16 kommentarer

hvorfor synchronized

Er der nogen der kan forklare mig, hvorfor StringBufferen er synchronized i funktionen "public static String replace(String s, String sub, String with)"? Der bruges jo ingen variabler til deling ml. trådene.


http://www.koders.com/java/fid2071FAE5BF4BAC830E1799FFF68FF6F845706727.aspx?s=md5
Avatar billede mikkelbm Nybegynder
12. december 2006 - 18:34 #1
For at andre tråde ikke kan tilgå den, mens der arbejdes på den.
Avatar billede arne_v Ekspert
12. december 2006 - 18:34 #2
jeg synes heller ikke at det giver mening
Avatar billede arne_v Ekspert
12. december 2006 - 18:35 #3
mikkelbm>

andre traade tilgaa en lokal variabel i en metode ?
Avatar billede arne_v Ekspert
12. december 2006 - 18:35 #4
jeg antager at det er denne sektion:

      StringBuffer buf = new StringBuffer(s.length()+with.length());

        synchronized(buf)
        {
            do
            {
                buf.append(s.substring(c,i));
                buf.append(with);
                c=i+sub.length();
            } while ((i=s.indexOf(sub,c))!=-1);
           
            if (c<s.length())
                buf.append(s.substring(c,s.length()));
           
            return buf.toString();
        }
Avatar billede mikkelbm Nybegynder
12. december 2006 - 18:36 #5
Den gives med som parameter, så det er vel ikke utænkeligt?
Avatar billede mikkelbm Nybegynder
12. december 2006 - 18:37 #6
Ahh... Der er flere metoder :)

public static void append(StringBuffer buf,
                              String s,
                              int offset,
                              int length)
    {
        synchronized(buf)
        {
            int end=offset+length;
            for (int i=offset; i<end;i++)
            {
                if (i>=s.length())
                    break;
                buf.append(s.charAt(i));
            }
        }
    }
Avatar billede mikkelbm Nybegynder
12. december 2006 - 18:37 #7
Og jeg fik ikke læst spørgsmålet rigtigt. Beklager! Jeg kiggede på den forkerte metode.
Avatar billede fessoor Nybegynder
12. december 2006 - 18:59 #8
Ja, i har fat i den rigtige funktion. Jeg er ikke helt med, er i også enig i at den ikke behøver at være synchronized?

Måske i også kan forklare mig, hvordan det kan være at denne funktion kan være ca. 4 gange hurtigere end Java's egen String.replace?
Avatar billede fessoor Nybegynder
12. december 2006 - 19:02 #9
Her sammenligner jeg med http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#replace(java.lang.CharSequence,%20java.lang.CharSequence)
Avatar billede arne_v Ekspert
12. december 2006 - 19:06 #10
lige netop den synchronized ligner en copy paste
Avatar billede arne_v Ekspert
12. december 2006 - 19:08 #11
er den 4 gange hurtigere ?
Avatar billede fessoor Nybegynder
12. december 2006 - 19:19 #12
Ja sådan cirka (også 5) på små strenge...

String s = "er den 4 gange hurtigere ?";

long lastTime = System.currentTimeMillis();
for (int i=0; i<1000000; i++)
s.replace("4","");
System.out.println("Spend: " + (System.currentTimeMillis()-lastTime));

lastTime = System.currentTimeMillis();
for (int i=0; i<1000000; i++)
replace(s,"4","");
System.out.println("Spend: " + (System.currentTimeMillis()-lastTime));


Spend: 2532
Spend: 547
Avatar billede arne_v Ekspert
12. december 2006 - 21:08 #13
Jeg kiggede lidt i String.java - den replace metode er implementeret med
regex metoder (selvom den ikke laver regex som replaceAll goer) - det er derfor
den er langsom.
Avatar billede fessoor Nybegynder
12. december 2006 - 22:36 #14
hmmm... Det forklarer det jo. Men utroligt at man her i 2006 med Java 6.0 selv skal implementerer sin egen string replace! Er der nogen der kan give mig en forklaring på hvorfor Sun ikke har lavet en ordentlig String.replace ?
Avatar billede arne_v Ekspert
13. december 2006 - 02:59 #15
nu var det 1.5 source jeg kiggede i

hvis du vil vide hvorfor skal du jo egentligt spørge nogen hos SUN

men skulle jeg gætte så er det gået ca. sådan:

Java 1.4:

man introducerer regex i Java

en meget smart men måske ikke særlig praktisk programmør tilføjer replaceAll
metoden til String

den har super funktionalitet fordi den bruger regex

Java 1.5:

det vælter ind med klager over replaceAll fra brugere som ikke har læst docs
grundigt nok og ikke kan forstå at replace af "\\s", "." og diverse andre
strenge giver andre resultater end de forventer

yngste programmør får til opgave at lave en replace som ikke bruger regex

han cloner replaceAll metoden som den replace vi diskuterer og nøjes med
at tilføj Pattern.LITERAL så den ignorerer regex betydning
Avatar billede arne_v Ekspert
17. marts 2007 - 02:50 #16
all set ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester