programmera.net -> jsp -> normal för utskrift | info@programmera.net |
Trådsäkerhet
1. Webb-behållaren är trådad 2. Vad är trådsäkerhet? 3. Gränssnittet SingleThreadModel 4. synchronized |
1. Webb-behållaren är trådad
Webb-behållaren är en trådad applikation, vilket innebär att många trådar körs samtidigt. Vill du veta mer om hur trådar fungerar, se
java/trådar . Webb-behållaren fungerar ungefär såhär:
Alltså, alla förfrågningar som kommer in till servern behandlas samtidigt, vanligtvis genom att processorn hoppar mellan trådarna och jobbar en liten stund med varje. Om servern har flera processorer kan den däremot arbeta med flera trådar parallellt.
2. Vad är trådsäkerhet?
Ofta använder många trådar samma servlet samtidigt. En servlet är trådsäker om många trådar kan köra den samtidigt utan att man får felaktigheter i beräkningarna. För att förstå hur fel kan uppstå måste vi titta på hur minneshanteringen fungerar för en webb-behållare.
Än så länge intet nytt, vi minns från sidan
java/trådar att en JVM hanterar lokala variabler respektive instansvariabler på samma sätt.
3. Gränssnittet SingleThreadModel
Om en servlet inte är trådsäker kan man låta den implementera gränssnittet javax.servlet.SingleThreadModel. Nu kan inte webb-behållaren anropa servletens doXXX()-metod med mer än en tråd i taget. Samma sak går att åstakomma för en JSP-sida. Om en JSP-sida inte är trådsäker kan man tvinga servern att bara låta en tråd i taget köra sidan med:
När JSP-sidan nu omvandlas till en servlet, gör direktivet ovan att servleten implementerar javax.servlet.SingleThreadModel, som ovan. Hur fungerar då SingleThreadModel? Normalt laddas en instans till minnet och flera trådar använder samma instans samtidigt. Men om servleten implementerar SingleThreadModel kommer flera instanser att laddas till minnet, och anropen till doXXX()-metoderna kommer att synkroniseras mellan trådarna. Nu kan inte trådarna ändra varandras instansvariabler längre.
<% page isThreadSafe="false" %>
4. synchronized
Ett annat och ofta bättre alternativ är att använda nyckelordet synchronized inuti sidan, och på så sätt göra sidan trådsäker. Nyckelordet beskrivs utförligare på sidan
/java/trådar , men här kommer en repetition. Nyckelordet synchronized fungerar så att det ser till att endast en tråd i taget kan gå in i ett synchronized-block. Ett synchronized-block kan skapas på 2 sätt:
Då en tråd går in i ett synchronized-block så låses alltid ett objekt. Att ett objekt är låst betyder att endast en tråd får tillgång till objektet tills låset är borta. Oftast låser man objektet this, alltså servleten själv. Detta sker automatiskt då man deklarera en metod som synchronized. Ibland vill man dock låsa något annat objekt. Syntaxen för att göra ett block synchronized är:
Där obj är objektet man vill låsa.
synchronized( obj ){
// some code
}