2010-02-10 36 views

Trả lời

21

Thực tế: chỉ có 1 thể hiện của một servlet trong của webapp cả đời. Nó được tạo ra khi khởi động webapp và nó bị phá hủy khi tắt webapp. Ngoài ra, hãy xem this answer để biết cách giải thích sơ bộ.

Vì vậy, nó được chia sẻ giữa tất cả các yêu cầu (chủ đề). Nếu bạn chỉ định yêu cầu hoặc phiên dữ liệu scoped như trường hợp (hoặc thậm chí tệ hơn, như static) biến, sau đó nó chắc chắn không phải là threadsafe, bởi vì nó sau đó được chia sẻ giữa tất cả các yêu cầu (chủ đề) từ tất cả người dùng (phiên) applicationwide. Bạn chỉ cần gán chúng làm phương thức biến cục bộ để giữ chúng an toàn. Vì vậy:

public class MyServlet extends HttpServlet { 

    private Object thisIsNOTThreadSafe; 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     Object thisIsThreadSafe; 

     thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests! 
     thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe. 
    } 
} 

Về cơ bản, tất cả những gì bạn cần phải tính đến khi phát triển các servlet có chủ đề an toàn.

Sau đó có các thuộc tính phiên (HttpSession) có thể được chia sẻ giữa nhiều yêu cầu từ cùng một người dùng, nhưng trong thế giới thực, bạn thực sự không cần phải lo lắng về việc đồng bộ hóa quyền truy cập phiên. Bạn thường chỉ đặt dữ liệu người dùng cụ thể ở đó, chẳng hạn như người dùng đã đăng nhập, tùy chọn dành riêng cho người dùng, giỏ mua hàng, v.v. Bạn chỉ cần đảm bảo rằng bạn không đặt dữ liệu phạm vi yêu cầu thuần túy trong phạm vi phiên. Nó sẽ được phản ánh trong nhiều cửa sổ trình duyệt/tab trong cùng một phiên.

Sau đó có ứng dụng (ServletContext) thuộc tính được chia sẻ giữa tất cả người dùng trên toàn ứng dụng, nhưng bạn thường chỉ đặt hằng số và dữ liệu tĩnh khác, như cấu hình webapp, nhà máy DAO, nội dung danh sách thả xuống, v.v.Tất cả điều này có thể được thực hiện bằng cách thực hiện với ServletContextListener, cũng xem this answer để có ví dụ cơ bản. Bạn chỉ cần đảm bảo rằng bạn không đặt dữ liệu phạm vi yêu cầu hoặc phiên thuần túy trong phạm vi ứng dụng.

+0

Một câu hỏi liên quan đến "một servlet trong đời của ứng dụng web" - Tôi nghĩ đó là một đối tượng gộp, vì vậy ở đó * có thể * nhiều hơn một tùy theo động cơ của servlet tùy thuộc vào tải. Điều đó không đúng? – duffymo

+0

Chỉ khi nó thực hiện (theo Servlet 2.4 không được chấp nhận) 'SingleThreadModel'. – BalusC

+0

@ BalusC: Cảm ơn rất nhiều Ngài, câu trả lời này đã giúp tôi cuối cùng. Tôi đã xóa câu hỏi của tôi và upvoted câu trả lời của bạn. Không có ai giống bạn trong Java. Cảm ơn một triệu lần nữa. –

0

Bạn có ý nghĩa trong ngữ cảnh trái với bất kỳ ứng dụng java nào khác không? Thực sự không có nhiều khác biệt. Mỗi yêu cầu đối với một servlet làm cho thùng chứa phát hành một luồng mới để xử lý nó, do đó các biến mẫu trong servlet phải là an toàn luồng. Tốt hơn là xử lý tất cả các biz của bạn với các biến cục bộ trong các phương thức doGet/doPost(). Có một thứ mà tôi có thể nghĩ đến. Với các biến phiên, có thể là trường hợp người dùng có hai cửa sổ trình duyệt đang mở, cả hai đều trỏ đến ứng dụng của bạn. Trong trường hợp này, bạn sẽ cần phải xem ra cho an toàn thread với phạm vi phiên là tốt.

1

Ồ, đó là câu hỏi được tải.

Để đơn giản, bạn cần đảm bảo rằng quyền truy cập vào bất kỳ dữ liệu được chia sẻ nào được đồng bộ hóa cẩn thận. Ví dụ: bạn có thể muốn đồng bộ hóa quyền truy cập vào biến tĩnh với mutex hoặc chức năng được đồng bộ hóa.

Lưu ý rằng bạn cũng có thể cần phải đồng bộ hóa ở các cấp cao hơn nếu bạn cần giao dịch nguyên tử sửa đổi nhiều tài nguyên được chia sẻ cùng một lúc.

Thiết kế ứng dụng đồng thời không đơn giản và không có viên đạn ma thuật (không may). Tôi rất khuyên bạn nên cuốn sách "Java Concurrency in Practice" để biết thêm thông tin về cách viết mã đồng thời an toàn.

16
+2

Tôi nghĩ mục 4 khá nhiều supercedes (bao gồm) 1-3. :) –

+3

tốt, có một nhu cầu cho một số kiến ​​thức cơ bản trước khi bạn có thể làm cho một số suy nghĩ tốt – Bozho

+0

+1 cho mục 4 :) – BalusC

Các vấn đề liên quan