Phạm vi đơn/phiên của hạt Spring yêu cầu quyền truy cập vào tất cả các trường của nó phải được đồng bộ hóa không? Nói thông qua từ khóa "được đồng bộ hóa" hoặc sử dụng một số lớp từ gói "java.util.concurrent".Mùa xuân: Phạm vi Singleton/phiên và đồng thời
Ví dụ: mã này có phải là chuỗi không an toàn không? (Copy/pased từ here):
@Component
@SessionScoped
public class ShoppingCart {
private List<Product> items = new ArrayList<Product>();
public List<Product> getAllItems() {
return items;
}
public void addItem(Product item) {
items.add(item);
}
}
Nếu ai đó gọi getItems() và bắt đầu lặp lại qua nó, trong khi cùng lúc một luồng khác thực hiện addItem(), bạn sẽ chặn một ConcurrentModificationException. Xem http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html để biết các ghi chú về những gì cần được đồng bộ hóa cho an toàn luồng với ArrayList. –
Lớp học không an toàn bởi vì bộ sưu tập 'các mục' không được xuất bản một cách an toàn; items.add() không cung cấp bất kỳ sự bảo đảm nào mà hiệu ứng của nó có thể nhìn thấy trên luồng hơn là hiện tại và nó không phải là nguyên tử. –
Hmmm Tôi đã được ấn tượng rằng thực tế là lớp học cũng là 'SessionScoped' và chỉ có thể được hành động bởi một diễn viên duy nhất trong thùng chứa Spring sẽ đảm bảo an toàn luồng của lớp học? –