Java7のCalendarとGregorianCalendarのソースコードへのリンクは次のとおりです。
コードを読むと、どのインスタンスメソッドも同期されておらず、どのインスタンスフィールドも同期されていないことがわかりますvolatile
。get
また、fieldメソッドでさえ、Calendarインスタンスを変更させる可能性があることもわかります。また、同期が実行されないため、このような変更操作に続いて、異なるスレッドが古いバージョンのCalendarオブジェクトのフィールドを参照する場合があります。
記録として、フィールドgetメソッドのミューテーションアクションは、このメソッドの呼び出し中/中に発生します。
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 }
つまり、このCalendar
クラスはスレッドセーフではなく、スレッドセーフでGregorianCalendar
はないフィールドとメソッドを継承しているためでもありません。
しかし、私の言葉だけを信じてはいけません。ソースコードを独自に分析します。
そして、それを締めくくりに、ドキュメントは、カレンダーについても、日付についても、何らかの形で何も述べていません。
javadocsでクラスのスレッドセーフが指定されていない場合は、スレッドセーフではないと見なす必要があります。(特に、クラスが設計により変更可能である場合。)