Cho phép lấy SimpleDateFormat làm ví dụ vì nó không phải là chủ đề an toàn.dễ bay hơi vs threadLocal trong java
tôi có thể cho phép mỗi thread để có bản sao riêng của mình SimpleDateFormat sử dụng ThreadLocal như thế này:
private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
@Override
protected SimpleDateFormat initialValue()
{
return new SimpleDateFormat("yyyyMMdd HHmm");
}
};
Nhưng đảm bảo từ khóa volatile a thread sẽ có các bản sao mới nhất của biến. Vì vậy, tôi không thể làm điều này thay thế:
volatile SimpleDateFormat myformatter;
và đạt được cùng một chủ đề an toàn?
Vì đó không phải là nơi vấn đề an toàn chủ đề xảy ra: vấn đề an toàn chủ đề là 'SimpleDateFormat' có trạng thái có thể thay đổi, độc lập với việc tham chiếu được lưu trữ trong trường biến động hay không. –
Thread-local và 'volatile' không làm như vậy! Với thread-local, có một bản sao riêng của biến cho mỗi luồng. Với 'volatile', tất cả các luồng chia sẻ một biến. Việc biến biến 'volatile' không làm cho nó an toàn thread, bởi vì' SimpleDateFormat' có trạng thái bên trong mà không được cập nhật bởi nhiều luồng đồng thời, như Andy đã đề cập. – Jesper