2013-05-08 12 views
5

Mam jedno pytanie. W mojej aplikacji mam serwlet, którego kod inicjujący jest jak poniżej.Metoda init serwletu ze zsynchronizowanym blokiem

public class GameInitServlet extends HttpServlet { 

private static boolean initialized = false; 

@Override 
    public void init() throws ServletException { 
     // This is a safeguard against running init() more than once. 
     synchronized (GameInitServlet.class) { 
      if (initialized) { 

       LOG.error("GameInitServlet has already been initialized... Bailing out!"); 
       return; 
      } 
      initialized = true; 
     } 
     //some code here.... 
    } 
} 

UWAGA: W web.xml wyżej aplet jest posiadanie obciążenia na starcie jako 1, więc zostanie on zainicjowany w momencie uruchamiania aplikacji.

Moje pytanie brzmi: dlaczego synchronizujemy metodę init. W końcu będzie on obsługiwany przez kontener serwletów i będzie wywoływany tylko raz. Czy mogę usunąć powyższy proces synchronizacji lub wystąpi pewien wpływ na aplikację po jej usunięciu.

+0

Może to pomóc: http://stackoverflowflow.com/questions/7826452/servelt-thread-pool-vs-servlet-instance-pool-by-the-web-container – Uooo

Odpowiedz

3

zostanie wykonany tylko raz, kiedy Servlet jest początkowo ładowany do kontenera w jego pojedynczej instancji, którą utworzy Kontener. Następnie zostaną wykonane metody dla każdego żądania jako osobne wątki wykonania. Nie widzę żadnego punktu synchronizującego metody ani żadnego kodu wewnątrz niego. Nawet w środowisku rozproszonym może istnieć jedna instancja Serwletu na JVM. Uważam, że Kontener jest na tyle mądry, aby wywoływać tylko jeden raz w ciągu życia Serwletu i dlatego nie będzie żadnego konfliktu pomiędzy wieloma wątkami, aby wykonać init(). Zgodnie z Javadocs,

Kontener serwletu wywołuje metodę init dokładnie jeden raz po utworzeniu serwletu. Metoda init musi zakończyć się pomyślnie, zanim serwlet będzie mógł odbierać żądania.

1

W komentarzu mówi

// This is a safeguard against running init() more than once. 

To jest po prostu staramy się uratować jakąś rasę warunek, który nigdy nie powinno się zdarzyć.

Wszelkie serwlety, filtry i programy nasłuchujące działają tak długo, jak długo żyje aplikacja internetowa. Są one dzielone między wszystkie żądania we wszystkich sesjach.

Można więc powiedzieć, że metoda init() jest wywoływana raz, w kontenerze. Nie ma więc potrzeby posiadania bloku synchronizacji.

Ale, bierzesz blokadę na poziomie klasy nie na poziomie obiektu, jakikolwiek powód tego samego? Powinieneś sprawdzić wszystkie zsynchronizowane wywołania statyczne, może istnieć uzasadniony powód posiadania tego bloku. Jeśli nie, możesz usunąć to samo.

Widać jakieś dobre wytłumaczenie here

0

Generalnie zgadzam się z oceną.

Wygląda na to, że nie implementuje singlethreading, więc usunięcie "sychronizowanego" nie powinno zaszkodzić.

Z drugiej strony nie powoduje prawie żadnych strat w wydajności, więc usuwanie odbywa się wyłącznie w celu "ograniczenia cruftu".

Powiązane problemy