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

标签 java calendar

我一直假设 DateCalendar 都不是线程安全的,但是在最近的一次讨论中,一位同事告诉我 日历 是线程安全的。

所以,我做了一些研究,但一无所获。有很多人认为它是线程安全的,也有很多人认为它不是线程安全的。而且,最重要的是,文档没有以任何方式说明任何内容,Calendar 甚至 Date 都没有说明。

那么,它是什么?

最佳答案

这里是Calendar的源代码链接和 GregorianCalendar在 Java 7 中

如果您阅读代码,您会发现没有一个实例方法是同步的,并且没有一个实例字段是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 也不是,因为它继承了非线程安全的字段和方法。

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


And, to top it off, the documentation doesn't say anything one way or another, not for Calendar, nor even for Date.

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

关于java - java.util.Calendar 线程是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12131324/

相关文章:

java - 在同一实例上使用同步方法锁定

java - 由于类型不兼容,接收不同通用列表的方法不起作用

javascript - FullCalendar:使用 Google 日历事件的位置属性

android - 以编程方式在 Android 中添加日历事件不会同步到网络

java - 查找给定日期中第一次出现的星期日

java - Spring Cloud Task 无需将元数据保存到数据库?

java - 有人用 Java 进行大型机或 AS/400 批处理吗?

java - 使用 ifelse 显示工作日

python - 日历系统,如 Python 中的 Google Calendar

java - 如何处理 setter 在 JAXB 自动从请求正文解码时抛出的异常?