java.util.Calendar线程是否安全?
我一直在假设线程安全Date
也不Calendar
是线程安全,但是在最近的一次讨论中,一位同事告诉我Calendar
线程安全。
因此,我做了一些研究,却一无所获。很多人认为它是线程安全的,很多人认为它不是线程安全的。而且,最重要的是,文档没有以一种或另一种方式说任何话,不是为了Calendar
,甚至不是Date
。
那是什么呢?
回答:
这是指向Java 7
中Calendar和GregorianCalendar的源代码的链接。
如果阅读该代码,您将看到没有实例方法同步,并且实例字段都不同步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 }
简而言之,Calendar
该类不是线程安全的,GregorianCalendar
也不是因为它继承了非线程安全的字段和方法。
但是,不要只相信我的话。对源代码进行自己的分析。
而且,最重要的是,文档没有以一种或另一种方式说任何东西,既不是针对日历,也不是针对日期。
如果javadocs没有指定类的线程安全,则应 假定 它不是线程安全的。
以上是 java.util.Calendar线程是否安全? 的全部内容, 来源链接: utcz.com/qa/434841.html