Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Servlet - otkud synchronized blok?

[es] :: Java :: Servlet - otkud synchronized blok?

[ Pregleda: 2993 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Herkul
Beograd

Član broj: 39370
Poruke: 35
*.adsl-1.sezampro.yu.



+1 Profil

icon Servlet - otkud synchronized blok?26.12.2007. u 10:49 - pre 198 meseci
Prema specifikaciji servleta svaki servlet se izvrsava u jednom threadu. Sledeci kod mi nije jasan (jednostavan brojac poseta):

public class SimpleCounter extends HttpServlet {

int count = 0;

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
synchronized(this) {
count++;
out.println("Since loading, this servlet has been accessed " +
count + " times.");
}
}

Ako postoji samo je thread otkud synchronized blok?

Hvala unapred
86,45% svih istrazivanja je izmisljeno
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.adsl-2.sezampro.yu.



+13 Profil

icon Re: Servlet - otkud synchronized blok?26.12.2007. u 11:08 - pre 198 meseci
Nisi bas dobro skapirao. Postoji jedan servlet. Medjutim, svaki zahtev klijenta je novi thread koji izvrsava metodu doGet ili doPost. Ako imas globalnu (instance) varijablu u servletu i pristupas joj iz neke od ove dve metode, rizikujes. Zato moras da sinhronizujes. Isto tako, ako iz servleta pristupas nekom beanu iz application scope-a, moras da sinronizujes. Procitaj malo o zivotnom ciklusu, bice ti sve jasno.
 
Odgovor na temu

augustus
Novi Sad - Beograd

Član broj: 101581
Poruke: 358
*.intens.co.yu.



+46 Profil

icon Re: Servlet - otkud synchronized blok?26.12.2007. u 11:17 - pre 198 meseci
Servleti nisu thread safe i posto se svaki servlet kreira samo jednom(jedna instanca servleta je aktivna na serveru) svaki klijent koji zatrazi pristup servletu dobice i sve njegove atribute...

Dakle niko ti ne garantuje da je tvoj count konzistentan. Zbog toga ga moras staviti u sinhronizovani blok da bi obezbedio konzistenciju.

Evo jedno trik pitanje: ako servlet nije thread safe, kako onda sve lepo funkcionise i bez sinhronizacije? :)
"Čovek je biće koje se na sve navikava, i ja mislim da je ovo njegova najbolja definicija."
Fjodor M. Dostojevski
 
Odgovor na temu

Herkul
Beograd

Član broj: 39370
Poruke: 35
*.adsl-1.sezampro.yu.



+1 Profil

icon Re: Servlet - otkud synchronized blok?26.12.2007. u 11:23 - pre 198 meseci
@Vanja Petreski
Hvala za odgovor

Medjutim i dalje mi nije jasno. O zivotnom ciklusu sam procitao par puta, a i nisam pocetnik u javi (u J2EE jesam). Ono sto i dalje ne kapiram je sta ce synhonized blok ako posoji samo jedan servlet thread. Zar ne bi trebalo da ne moze da se pozove drugi doGet() dok prvi nije zavrsio, ako postoje dva requesta u dovoljno kratkom periodu? Ili request objekti enkapsuliraju servlet klasu. Aj molim vas malo detaljnije ako nije problem.
Pozdrav
86,45% svih istrazivanja je izmisljeno
 
Odgovor na temu

Herkul
Beograd

Član broj: 39370
Poruke: 35
*.adsl-1.sezampro.yu.



+1 Profil

icon Re: Servlet - otkud synchronized blok?26.12.2007. u 11:39 - pre 198 meseci
@augustus
Sta znam meni to deluje da kaobojagi postoji samo jedan servlet thread a da ustvari to nije tako, nego se pravi za svaki zahtev po jedan a na serveru je da nekako obezbedi da svi threadovi dele instance varijable, na primer.

Jel bi znao neko da mi napise delaljni progam flow od primanja zahteva do odgovora, recimo na primeru na Tomcat-a?
Mislim da bi mi to pomoglo. U principu ovo sve i nije toliko bitno za programiranje, ali me zanima sta se desava ispod haube.

Hvala svima na odgovorima
86,45% svih istrazivanja je izmisljeno
 
Odgovor na temu

augustus
Novi Sad - Beograd

Član broj: 101581
Poruke: 358
*.intens.co.yu.



+46 Profil

icon Re: Servlet - otkud synchronized blok?26.12.2007. u 11:46 - pre 198 meseci
Uh kako ono bese: svaki poziv poziv funkcije povlaci za sobom kreiranje steka, smestanje promenjljivih u njega itd...moze se pozvati doGet iako se nije zavrsilo izvrsavanje prethodnog poziva. Ako se koristi atribut servleta on ce se smestiti na stek oba poziva i tamo ce se menjati ili sta vec treba da se radi sa njim. Sto znaci dok jedan klijent barata sa jednom vrednoscu, drugi misli da ima pravu ali je nema jer ju je onaj drugi vec promenio (al sam napisao recenicu svaka cast...sad ce pauza :))

Tako da imas problem sinhronizacije ako jedan atribut mogu da menjaju svi klijenti, a svakom klijentu treba njegova stvarna vrednost.

Trik pitanje i dalje stoji :)
"Čovek je biće koje se na sve navikava, i ja mislim da je ovo njegova najbolja definicija."
Fjodor M. Dostojevski
 
Odgovor na temu

augustus
Novi Sad - Beograd

Član broj: 101581
Poruke: 358
*.intens.co.yu.



+46 Profil

icon Re: Servlet - otkud synchronized blok?26.12.2007. u 11:47 - pre 198 meseci
Nisam video odgovor:
Citat:
Sta znam meni to deluje da kaobojagi postoji samo jedan servlet thread a da ustvari to nije tako, nego se pravi za svaki zahtev po jedan a na serveru je da nekako obezbedi da svi threadovi dele instance varijable, na primer.


Wrong answer :) ima samo JEDNA instanca na serveru
"Čovek je biće koje se na sve navikava, i ja mislim da je ovo njegova najbolja definicija."
Fjodor M. Dostojevski
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.adsl-2.sezampro.yu.



+13 Profil

icon Re: Servlet - otkud synchronized blok?26.12.2007. u 12:02 - pre 198 meseci
Ok, ajmo detaljnije. Stvar je veoma prosta:

Server kreira samo jednu instancu servleta. Tada poziva init metodu gde se radi inicijalizacija servleta. Ako postoje globalne varijable, tu mozes da ih inicijalizujes.

Kada server detektuje request on pravi jedan thread (ali ne thread servleta) koji poziva service metodu servleta. Ta metoda detektuje o kakvom se tipu requesta radi, i ko zna sta jos i u zavisnosti od toga poziva ili doGet ili doPost metodu.

Iz ovoga je jasno da kada imamo vise requestova, imamo vise threadova koji istovremeno gadjaju service metodu naseg jednom instanciranog servleta.

A to znaci da moramo da radimo sinhronizaciju deljenih varijabli. Na lokalnim varijablama metoda ne moramo da sinhronizujemo.

Jasnije?

Btw, moguce je da servlet implementira SingleThreadModel interfejs, sto garantuje da samo jedan thread moze da pristupi servletu, ali ovo nije dobra praksa. Bolje je sinhronizovati tamo gde je potrebno!
 
Odgovor na temu

Herkul
Beograd

Član broj: 39370
Poruke: 35
*.adsl-1.sezampro.yu.



+1 Profil

icon Re: Servlet - otkud synchronized blok?26.12.2007. u 12:04 - pre 198 meseci
Hvala na odgovorima. Izgleda da ja threading nisam bas do kraja skapirao.
Misilo sam da synhronized blokovi mogu da budu samo u metodi multithread odjekata, koji korise isti resuras.
Nisam znao da mogu da budu i u resursu.
Jel to to?

Citat:
augustus: Nisam video odgovor:


Wrong answer ima samo JEDNA instanca na serveru



Ovaj primer ne funkcionese bez sinhronizacije (valjda )

86,45% svih istrazivanja je izmisljeno
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.adsl-2.sezampro.yu.



+13 Profil

icon Re: Servlet - otkud synchronized blok?26.12.2007. u 12:13 - pre 198 meseci
Linkovi govore vise od hiljadu reci

http://java.sun.com/docs/books...sential/concurrency/index.html
http://volume1.coreservlets.com/
 
Odgovor na temu

Herkul
Beograd

Član broj: 39370
Poruke: 35
*.adsl-1.sezampro.yu.



+1 Profil

icon Re: Servlet - otkud synchronized blok?26.12.2007. u 12:18 - pre 198 meseci
Citat:
Vanja Petreski: Ok, ajmo detaljnije. Stvar je veoma prosta:

Server kreira samo jednu instancu servleta. Tada poziva init metodu gde se radi inicijalizacija servleta. Ako postoje globalne varijable, tu mozes da ih inicijalizujes.

Kada server detektuje request on pravi jedan thread (ali ne thread servleta) koji poziva service metodu servleta. Ta metoda detektuje o kakvom se tipu requesta radi, i ko zna sta jos i u zavisnosti od toga poziva ili doGet ili doPost metodu.

Iz ovoga je jasno da kada imamo vise requestova, imamo vise threadova koji istovremeno gadjaju service metodu naseg jednom instanciranog servleta.

A to znaci da moramo da radimo sinhronizaciju deljenih varijabli. Na lokalnim varijablama metoda ne moramo da sinhronizujemo.

Jasnije?

Btw, moguce je da servlet implementira SingleThreadModel interfejs, sto garantuje da samo jedan thread moze da pristupi servletu, ali ovo nije dobra praksa. Bolje je sinhronizovati tamo gde je potrebno!


Hvala puno! Jasnije, mnogo jasnije
Bunilo me je to sto sam do sad koristio sinhronizaciju u threadovima, ne u objektu koji threadovi koriste. Nisam znao da to uopse moze.

bwt: jel moguce koristiti thread koji server kreira pri requestu iz servleta? Koji je to objekat? Cisto akademsko pitanje, ne verujem da bih ikad koristio, posto ServletContext, ServletResponce itd. klase pruzaju sve sto je potrebno.


86,45% svih istrazivanja je izmisljeno
 
Odgovor na temu

[es] :: Java :: Servlet - otkud synchronized blok?

[ Pregleda: 2993 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.