Citat:
Ursprungligen postat av searchsian
Till att brja med, en doget method spawnas ut i en egen trd... men delar den metoder frn servleten med andra trdar?
Vad r det fr skillnad p static och private nr bda delas av samtliga trdar i serlveten? Delas de vriga metoderna p samma stt i mainservlet?
Frstr inte riktigt vad du menar, men en servlet startar ju en egen trd per anrop som du redan sagt.
Ett typexempel p nr man kan rka ut fr diverse lustiga effekter r om man skulle vilja gra en "trffrknare" med en servlet. D skulle du bli tvungen att dels ha en variabel som delas mellan alla trdar som sedan stegar upp ett fr varje gng servleten anropas, right?
Denna variabel kommer vara private, eftersom det endast r den aktuella servleten som borde kunna ndra i den, den br ju ven vara deklarerad static eftersom det inte finns nn mening med att ha flera instanser av denna variabel i olika servlets.
Det lustiga kommer d nr man ska uppdatera denna variabel. P en vlbeskt sida skulle det ju kunna hnda att tv anrop kommer in exakt samtidigt, varp trdarna kommer att frska ndra i variabeln samtidigt. Det blir ju inget bra, fr vad r det som sger att den ena trden har mer rtt n den andra i detta fall? Hade det varit en delad databaskoppling hade man i vrsta fall tappat data, eftesom den ena tden kommer skriva data som inte finns i andra trden och nr den andra trden skriver till databasen kommer den ju skriva "gammal data" d.
Lsningen kommer i form av nyckelordet "synchronized" som man kan stta p antingen en variabel, en metod eller ett kodblock som anger att endast entrd i taget kan anvnda det aktuella kodblocket eller vad det nu r, de andra trdarna fr vnta tills den aktuella trden r klar med det synkroniserade kodstycket. Ett exklusivt "ls skulle man kunna kalla det.
Blev du klokare av det hr?