2014-11-17 1 views
0

아래 코드에서 synchronized (this)를 사용하지 않으면 어떻게됩니까? 이 서블릿이 서블릿 규칙을 올바르게 다루고 있습니까?세션의 동기화 목적은 무엇입니까

Integer counter = new Integer(0);// instance variable 

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
    response.setContentType("text/html;charset=UTF-8"); 
    PrintWriter out = response.getWriter(); 
    try { 
     out.println("<html><head><title>Calculate Number of Times Visits Using Session</title></head><body>"); 
     HttpSession visitSession = request.getSession(true); 
     if(visitSession.isNew()) 
      out.println("This is the first time you are visiting this page."); 
     else 
      out.println("Welcome back to this page"); 

     synchronized(this) { 
      out.println("<br><br>You have visited this page " + (++Counter)); 
      out.println((Counter == 1) ? " time " : " times "); 
     } 
     out.println("</body></html>"); 
    } finally { 
     out.close(); 
    } 
} 
+0

'카운터'란 무엇입니까? 수업? 반원? –

+0

'Counter '는 방문 횟수를 나타내는 정수 값이라고 생각합니다. 다중 스레드 환경에서 ur 서블릿을 사용합니까? – OO7

+1

@ OO7 명백합니다. 그러나 그것이 정수라면 그것은 변경되지 않을 것입니다 ... – Fildor

답변

1

카운터에 따라 다릅니다.

카운터가 서블릿의 인스턴스 변수 인 경우 동기화 된 beacause를 사용해야합니다. 서버의 풀 스레드에있는 여러 스레드가 읽기 및 쓰기를 위해 동일한 변수 ("카운터")에 액세스 할 수 있습니다.

이 경우 블록을 동기화하지 않으면 일부 숫자가 손실되는 카운터를 인쇄 할 수 있습니다 (예 : "++"연산을 두 번 실행 한 다음 두 번 읽음) "++"연산을 읽지 못함) . 당신이 동기화 된 안정된 사용하는 경우

출력 등등 항상

You have visited this page 1 time You have visited this page 2 times You have visited this page 3 times

하고있을 것입니다. 당신이 원 공급기 사용하지 않는 경우

출력하기 위해서는 스레드 안전 하나가 될 수 없습니다 선언 세계적으로 된 카운터 (변수) 이후 예를

You have visited this page 1 time You have visited this page 3 times You have visited this page 3 times You have visited this page 4 times You have visited this page 6 times You have visited this page 6 times

+0

추가하기 전에 사전/증분/감소 연산자 (++/-)는 원자가 아님을 나타내며 실제로는 읽기 - 수정 - 쓰기의 3 가지 작업을 나타내므로 동기화가 더욱 중요합니다. 멀티 스레드 환경에서의 액세스. –

0

에 대한 임의의 순서로 수 스레드가 안전하도록 goGet() 내부에서 선언하십시오.이 경우 동기화가 필요하지 않습니다.

관련 문제