Avatar billede ppstyle Nybegynder
02. juli 2004 - 14:08 Der er 7 kommentarer og
1 løsning

Best practice ved brug af synchronized

Hej gutter, jeg har engang læst, at den bedste måde at synchronisere på var som følger:

String static toSynch = "toSynch";

public void write(){

synchronized(toSynch){
    // synchronized code
}
}

Og at følgende ikke er en god løsning:

public synchronized void write(){

    // synchronized code
}

Kan ikke helt huske hvorfor, men det var vist noget med, at synchroniserings erklæringen i metoden ikke gjorde metoden helt beskyttet alligevel. Hvad siger I ?

30 stærke til gode meninger og bud i brugen af best practice mht. synchronized statement i java.

Hilsen Daniel
Avatar billede arne_v Ekspert
02. juli 2004 - 14:11 #1
De 2 gør jo noget forskelligt !?!?

Den sidste svarer til den første *UDEN* static på toSynch.
Avatar billede arne_v Ekspert
02. juli 2004 - 14:13 #2
synch non-static metode = synch instans ~= synch non-static synch variabel
synch static metode = synch class ~= synch static synch variabel
Avatar billede arne_v Ekspert
02. juli 2004 - 14:15 #3
Der er ikke noget forkert ved at bruge synchronized på metoder.

Man skal kun bruge et synch objekt hvis man skal lave en synch mellem
alle instanser i en ikke static metode.

Hvis det er en meget lang metode kan der muligvis være nogle performance
mæssige fordele ved kun at synche en lille del af koden med en synch
variabel fremfor at synche hele metoden.
Avatar billede jakoba Nybegynder
02. juli 2004 - 14:23 #4
når du siger
  synchronized( objektInstans ) {
      // kode              // 'objektInstans' er låst imens koden kører
  }
så er det tilgang til KUN den objektinstans der lægges en lås på

når du gør en metode suncroniseret
  public synchronized void write(){
så er det den ojektinstans metoden kaldes i der bliver lagt en lås på
  objektInstans.write();  // 'objektInstans' er låst imens metoden kører

Der er ingen generel grund til at sige det ene er bedre end det andet.

Det eneste generellle er at man
1) bør undgå behovet for syncronisering hvis det er muligt
2) ikke låse flere data end strengt nødvendigt
3) passe på deadlocks.

mvh JakobA
Avatar billede jakoba Nybegynder
02. juli 2004 - 14:26 #5
Ups. undskyld Arne. du kom først.
Avatar billede ppstyle Nybegynder
02. juli 2004 - 14:32 #6
Jeg tror jeg forstår. Ved et objekt der kan tilgås fra mange metoder, er det selvfølgeligt vigtigt at synkronisere entop det objekt når det tilgås. Her kunne man vel med rette bruge synchronized(object) etc.

Mange tak og god weekend.
Avatar billede jakoba Nybegynder
02. juli 2004 - 14:52 #7
just :)

men for nu at væve lidt:

med dit eksempel
public void write(){
    synchronized( instansAfStatiskString ){
        // synchronized code
    }
}
her bruger du den string som en semafor for at undgå at andre kodestumper der benytter den samme semafor får lov at køre imens.

så med DET eksempel påtager du dig selv det fulde ansvar for at søger for at alle steder hvor de data der manipuleres bliver markeret med den samme syncronized sætning.

Det kan være en fordel nogen situationer, fx hvis der udskrives til en logfil fra mange tråde.

Men der følger ulemper med for de data der manipuleres i det låste område er reelt aldrig låst, enhver anden tråd kan tilgå og ændre dem, også imens din synkroniserede kode kører. Det eneste du sikrer dig er at flere kald til write ikke skriver tegn ud i munden på hinanden.
  "VariVarabiabel elx x  harhar vær diværendien 25 25"

thanx
Avatar billede arne_v Ekspert
02. juli 2004 - 14:56 #8
synchronized er altid coorperativ - uanset hvordan man gør det så er
det programmørens ansvar at bruge synchronized på det samme som vil tilgå
noget.
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