2012-07-14 39 views

Trả lời

22

Câu hỏi của bạn tóm tắt: đang gọi một phương thức từ nhiều luồng trên cùng một đối tượng là thread an toàn. Và câu trả lời là: nó phụ thuộc. Nếu đối tượng của bạn (để cho nó là servlet) là trạng thái không trạng thái hoặc chỉ có các trường final, đây là toàn bộ luồng an toàn. Các biến và tham số cục bộ là cục bộ cho luồng (nằm trên stack, không phải trên đống).

Ngoài ra, mỗi cuộc gọi service() nhận được phiên bản riêng biệt của ServletRequestServletResponse. Tuy nhiên đây là một ví dụ về servlet không an toàn:

public class UnsafeServlet implements Servlet { 

    private int counter; 

    public void init(ServletConfig config) throws ServletException { 
    } 

    public void service(ServletRequest request, ServletResponse response) 
     ++counter; 
    } 

    public void destroy() { 
    } 

} 

Kể từ nhiều luồng có thể truy cập counter biến, nó phải được bảo đảm bằng cách nào đó: hoặc bằng cách sử dụng synchronized (volatile là không đủ):

synchronized(this) { 
    ++counter; 
} 

hoặc AtomicInteger:

private AtomicInteger counter = new AtomicInteger(); 

//... 
counter.incrementAndGet(); 

Trong trường hợp cụ thể này AtomicInteger là tốt hơn nhiều e nó không khóa bằng thao tác CAS CPU trong khi synchronized là một mutex.

+0

@ Tomasz.can bạn đăng ở đây một ví dụ ngắn mà bạn có thể biện minh cho phép nói rằng bạn có một servlet đơn giản và với 2 trình duyệt khác nhau mà bạn đang thực hiện yêu cầu và chủ ý bởi một chủ đề bạn thay đổi giá trị. Điều này tôi muốn thấy .. !! Cảm ơn trước – user1508454

+0

Người đàn ông tuyệt vời, bạn có thể vui lòng đăng bài như thế nào bạn sẽ bảo vệ bộ đếm ngay bây giờ, và bằng cách đồng bộ nó sẽ tác động đến hiệu suất, bạn cũng có thể giải thích một chút về Atomic Integer – user1508454

+0

@ user1508454: xem các cập nhật của tôi –