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

回到顶部