java.util.Calendar线程是否安全?

Dan*_*ral 18 java calendar

我一直在假设既不是线程安全Date也不Calendar是线程安全的,但是,在最近的讨论中,一位同事告诉我Calendar是线程安全的.

所以,我做了一些研究,并没有提出任何建议.有很多人认为它是线程安全的,很多人认为它不是线程安全的.而且,最重要的是,文档不会以某种方式说出任何内容,不是为了Calendar,甚至也不是Date.

那么,这是什么?

Ste*_*n C 29

这是Java 7 中CalendarGregorianCalendar源代码的链接

如果您阅读代码,您将看到没有任何实例方法同步,并且没有实例字段volatile.您还将看到即使是字段get方法也可能导致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       }
Run Code Online (Sandbox Code Playgroud)

简而言之,Calendar该类不是线程安全的,GregorianCalendar也不是因为它继承了非线程安全的字段和方法.

但是,不要只听我的话.做自己的源代码分析.


而且,最重要的是,文档不会以任何方式说出任何内容,不是针对日历,甚至也不是针对日期.

如果javadocs没有指定类的线程安全性,那么您应该假定它不是线程安全的.