首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.util.Calendar线程是否安全?

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

Stack Overflow用户
提问于 2012-08-26 23:24:38
回答 2查看 18.2K关注 0票数 26

我一直认为DateCalendar都不是线程安全的,但在最近的一次讨论中,一位同事告诉我Calendar是线程安全的。

因此,我做了一些研究,但一无所获。有很多人认为它是线程安全的,也有很多人认为它不是线程安全的。而且,最重要的是,文档并没有以这样或那样的方式说明任何事情,无论是对Calendar,还是对Date

那么,到底是哪一个呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-27 00:20:16

下面是Java7中CalendarGregorianCalendar源代码的链接

如果阅读代码,您将看到没有一个实例方法是同步的,并且没有一个实例字段是volatile。您还将看到,即使是字段get方法也会导致日历实例发生变化。由于没有执行同步,因此不同的线程可能会看到Calendar对象字段在这样的变异操作之后的过时版本。

对于记录,get methods字段中的突变操作发生在调用此方法的过程中:

代码语言:javascript
复制
 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也不是,因为它继承了非线程安全的字段和方法。

但不要只相信我的话。对源代码进行自己的分析。

,最重要的是,文档没有以这种或那种方式说明任何事情,也没有说明日历,甚至也没有说明日期。

如果javadoc没有指定类的线程安全性,那么您应该认为它不是线程安全的。(特别是如果该类在设计上是可变的。)

票数 37
EN

Stack Overflow用户

发布于 2012-08-27 00:15:29

甲骨文的文档没有提到线程安全:http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

OpenJDK源代码(build b147)以非线程安全的方式实现java.util.Calendar,例如:

代码语言:javascript
复制
public void setTimeInMillis(long millis) {
  // skipped
  time = millis;
  isTimeSet = true;
  areFieldsSet = false;
  computeFields();
  areAllFieldsSet = areFieldsSet = true;
}

我认为可以安全地假设这个类是线程安全的,而不是线程安全的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12131324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档