2012-08-26 26 views
14

Tôi đã làm việc với giả định rằng không phải Date cũng không phải Calendar là an toàn chỉ, nhưng trong một cuộc thảo luận gần đây, một đồng nghiệp nói với tôi Calendar là an toàn chỉ.Chủ đề java.util.Calendar có an toàn hay không?

Vì vậy, tôi đã thực hiện một số nghiên cứu và không có gì. Có rất nhiều người cho rằng đó là chủ đề an toàn và nhiều người cho rằng nó không an toàn. Và, để đầu nó đi, 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 cho Calendar, thậm chí không cho Date.

Vì vậy, đó là nó?

+3

http: // stackoverflow.com/questions/6245053/how-to-make-an-static-calendar-thread-safe thấy rằng –

+0

@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

+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

Trả lời

24

Dưới đây là một liên kết đến mã nguồn của CalendarGregorianCalendar 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ỉ.

4

Tài liệu từ Oracle không nói gì về an toàn luồng: http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html.

mã nguồn OpenJDK (xây dựng b147) thực hiện java.util.Calendar một cách phi thread-an toàn, ví dụ:

public void setTimeInMillis(long millis) { 
    // skipped 
    time = millis; 
    isTimeSet = true; 
    areFieldsSet = false; 
    computeFields(); 
    areAllFieldsSet = areFieldsSet = true; 
} 

Tôi nghĩ rằng nó an toàn để giả định rằng lớp là không chủ đề an toàn.

-1

- Tôi không chắc chắn từ nơi bạn bè của bạn có các thông tin, nhưng nói về đơn giản và thẳng, Calendar class iskhôngThread safe.

- tôi không tìm thấy bất kỳ synchronized từ khóa trên báo cáo nguyên tử, cũng không volatile trường trong lớp Lịch cũng không phải trong lớp con của nó.

+5

sự hiện diện của từ khóa 'đồng bộ hóa 'hoặc' bay hơi' không phải là chỉ báo về an toàn luồng – yegor256

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