Dưới đây là một liên kết đến mã nguồn của Calendar và GregorianCalendar trong Java 7
Nếu bạn đọc mã bạn sẽ thấy rằng không ai trong số các phương pháp dụ được đồng bộ hóa, và không ai trong số các instance fields là volatile
. Bạn cũng sẽ thấy rằng ngay cả các phương thức của trường get
cũng có thể khiến một thể hiện Lịch biến đổi. Và vì không có đồng bộ hóa được thực hiện, các luồng khác nhau có thể thấy các phiên bản cũ của các trường của đối tượng Lịch sau một thao tác ngắt.
Đối với hồ sơ, hành động đột biến trong lĩnh vực này có được phương pháp xảy ra trong/trong khi gọi phương pháp này:
1555 protected void complete()
1556 {
1557 if (!isTimeSet)
1558 updateTime();
1559 if (!areFieldsSet || !areAllFieldsSet) {
1560 computeFields(); // fills in unset fields
1561 areAllFieldsSet = areFieldsSet = true;
1562 }
1563 }
Nói tóm lại, lớp Calendar
không phải là thread-an toàn, và không phải là GregorianCalendar
hoặc vì nó kế thừa các trường và phương thức không an toàn.
Nhưng đừng chỉ dùng từ ngữ của tôi cho nó. Làm phân tích của riêng bạn về mã nguồn.
Và, để đầu nó đi, các tài liệu không nói bất cứ điều gì một cách này hay cách khác, không phải cho Calendar, thậm chí cũng không cho ngày.
Nếu javadocs không chỉ định độ an toàn của một lớp, thì bạn nên giả sử rằng nó không phải là an toàn chỉ.
Nguồn
2012-08-26 16:20:16
http: // stackoverflow.com/questions/6245053/how-to-make-an-static-calendar-thread-safe thấy rằng –
@AlexColeman Lưu ý rằng câu trả lời đầu tiên cho biết "không", câu trả lời thứ hai cho biết "có" và không ai trong số tất cả các cuộc thảo luận đó được ủng hộ bởi bất cứ điều gì. –
+1 cho 'Joda Time'. Nếu vấn đề an toàn thread là mối quan tâm của bạn thì sử dụng điều này sẽ là một lựa chọn tốt. – Sujay