Bạn không cần khóa vì session.setAttribute()
là chủ đề an toàn (xem chú thích đặc tả servlet từ @McDowell ở trên).
Tuy nhiên, hãy sử dụng một ví dụ khác. Giả sử bạn muốn chek giá trị của thuộc tính, sau đó cập nhật nó nếu < = 100. Trong trường hợp này, bạn cần phải đồng bộ hóa khối mã cho số getAttribute()
so sánh < = 100 và setAttribute()
.
Bây giờ, bạn nên sử dụng khóa nào? Hãy nhớ rằng không có syncronization nếu các đối tượng khác nhau được sử dụng cho khóa. Vì vậy, các khối mã khác nhau phải sử dụng cùng một đối tượng. Lựa chọn đối tượng session
của bạn có thể tốt. Hãy nhớ rằng các khối mã khác nhau có thể truy cập phiên (cả đọc/ghi) ngay cả khi bạn đã lấy khóa, trừ khi mã khác cũng khóa trên đối tượng phiên. Một lỗ hổng ở đây là có quá nhiều chỗ trong mã của bạn lấy một khóa trên đối tượng phiên và do đó phải đợi. Ví dụ, nếu khối mã của bạn sử dụng thuộc tính phiên A và một đoạn mã khác sử dụng thuộc tính phiên B, nó sẽ là tốt đẹp nếu chúng không cần phải chờ đợi lẫn nhau bằng cách lấy khóa trên đối tượng phiên. Việc sử dụng các đối tượng tĩnh có tên LockForA và LockForB có thể là lựa chọn tốt hơn cho mã của bạn để sử dụng - ví dụ: synchronized (LockForA) { }.
Nguồn
2011-11-10 22:27:11
Đây không phải là khóa kiểm tra kép, đây chỉ là đặt giá trị trong bản đồ nếu nó chưa tồn tại. – Yishai
Đồng ý, sớm. Đã xóa. – Kevin
Làm cho khóa tĩnh thành lớp của tôi (không phải là một servlet, nhưng một lớp được tạo ra từ bên trong một trang jsp) đảm bảo rằng tất cả các yêu cầu đang đồng bộ hóa trên cùng một khóa? – MCS