`
superich2008
  • 浏览: 324340 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

DateFormat的使用注意点

    博客分类:
  • Java
阅读更多
Bug: Call to method of static java.text.DateFormat
Pattern id: STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE, type: STCAL, category: MT_CORRECTNESS
As the JavaDoc states, DateFormats are inherently unsafe for multithreaded use. The detector has found a call to an instance of DateFormat that has been obtained via a static field. This looks suspicous.
For more information on this see Sun Bug #6231579 and Sun Bug #6178997.

    上面的英文解释其实应该说得比较清楚,在Java文档中,已经明确说明了DateFormats 是非线程安全的,而在SimpleDateFormat的Jdk 的Source文件中,我们也找到这么一段注释,说明它不是线程安全的。
Date formats are not synchronized.
* It is recommended to create separate format instances for each thread.
* If multiple threads access a format concurrently, it must be synchronized
在Sun自己的网站上。在sun的bug database中,Sun Bug #6231579 ,Sun Bug #6178997都可以印证这个问题。
    导致SimpleDateFormat出现多线程安全问题的原因,是因为:SimpleDateFormat处理复杂,Jdk的实现中使用了成员变量来传递参数,这就造成在多线程的时候会出现错误。
    而Findbugs所说的“Call to static DateFormat”,其实就是一些人:为了渐少new 的次数而把SimpleDateFormat做成成员或者静态成员,上面已经说了,这样做是不安全的。
    其实,出现这种问题的代码一般都长得差不多,典型的代码示例如下:
===================================================================================

package test;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TestDateFormat
{
public static void main(String[] args)
{
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date today = new Date();
Date tomorrow = new Date(today.getTime() + 1000 * 60 * 60 * 24);
System.out.println("当前日期为:" + dateFormat.format(today));
System.out.println("明天日期为:" + dateFormat.format(tomorrow));

new Thread(new TestThreadToday(dateFormat, today)).start();

new Thread(new TestThreadTomorrow(dateFormat, tomorrow)).start();

}
}

class TestThreadToday implements Runnable
{

private DateFormat dateFormat;
private Date currentDate;

public TestThreadToday(DateFormat format, Date date)
{
this.dateFormat = format;
this.currentDate = date;
}

public void run()
{
// TODO Auto-generated method stub
final String currentDateStr = dateFormat.format(currentDate);
while(true)
{
try
{
Thread.sleep(100);
} catch (InterruptedException e)
{
}
String tempDateStr = dateFormat.format(currentDate);
System.out.println(Thread.currentThread().getName() + " : 当前日期 : " + tempDateStr);
if (false == tempDateStr.equals(currentDateStr))
{
System.out.println("日期格式化出现异常!!当前日期为:" + tempDateStr);
System.exit(0);
}
}
}

}

class TestThreadTomorrow implements Runnable
{

private DateFormat dateFormat;
private Date tomorrow;

public TestThreadTomorrow(DateFormat format, Date date)
{
this.dateFormat = format;
this.tomorrow = date;
}

public void run()
{
// TODO Auto-generated method stub
final String tomorrowDateStr = dateFormat.format(tomorrow);
while(true)
{
try
{
Thread.sleep(100);
} catch (InterruptedException e)
{
}
String tempDateStr = dateFormat.format(tomorrow);
System.out.println(Thread.currentThread().getName() + " : 明天日期 : " + tempDateStr);
if (false == tempDateStr.equals(tomorrowDateStr))
{
System.out.println("日期格式化出现异常!!明天日期为:" + tempDateStr);
System.exit(0);
}
}
}

}
分享到:
评论

相关推荐

    DateFormat_Dateformat_

    标题中的"DateFormat_Dateformat_"可能是指在编程中处理日期格式化时使用特定的分隔符“-”来组织日期字符串。在很多编程语言中,日期和时间的格式化是通过特定的方法或函数来完成的,这通常涉及到指定日期的各个...

    sql-dateformat.rar_DateFormat_datEformat SQL_sql中dateformat_时间格式

    然而,需要注意的是,在标准SQL中并没有`DATEFORMAT`这个函数,它更多地是数据库特定的语法,例如在MySQL和SQL Server中。在这些系统中,`DATEFORMAT`被用于设置或显示日期和时间的显示格式,而不是在查询中直接处理...

    DateFormat多线程问题

    总结来说,`DateFormat`的线程安全性问题要求开发者在多线程环境中特别注意其使用方式。通过理解这些潜在风险,我们可以采用适当的策略,如使用`ThreadLocal`,每次都创建新实例,或者切换到更现代的日期时间API,以...

    史上最牛的DateFormat

    `Date`对象有多种方法来获取日期和时间的各个部分,如`getFullYear()`、`getMonth()`(注意月份是从0开始的)和`getDate()`等。 然而,JavaScript的内置格式化并不直观,因此开发人员通常会自定义函数或使用库来...

    Java多线程编程中使用DateFormat类

    总的来说,Java的`DateFormat`类在多线程环境中使用时需要特别注意线程安全问题。通过同步、使用`ThreadLocal`或切换到像Joda-Time这样的第三方库,可以有效地解决这一问题,提高代码的并发性和安全性。在选择解决...

    js dateformat yyyy-MM-dd形式

    // 获取月份,注意月份是从0开始的,所以要加1 var day = ("0" + date.getDate()).slice(-2); // 获取日期 var formattedDate = year + "-" + month + "-" + day; // 组合成"yyyy-MM-dd"格式 ``` 这段代码首先创建...

    第6天(常用API【Date、DateFormat、Calendar、Math、System、包装类、正则表达式】)v20170

    然而,为了自定义日期格式,我们需要使用`DateFormat`类。 3. **DateFormat类** `java.text.DateFormat`是抽象类,用于格式化和解析日期或时间。其子类`SimpleDateFormat`提供具体实现。通过`SimpleDateFormat`的...

    javaweb 国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用

    Java Web国际化,通常称为I18N,是Java语言为了解决多语言环境下的软件...通过合理使用DateFormat、NumberFormat、MessageFormat和ResourceBundle,可以有效地解决不同地区用户的需求,提高应用的可访问性和可用性。

    Java/Android 获取系统时间

    - `DateFormat.getDateTimeInstance()`:获取日期和时间格式化器,默认使用中等格式。 - `DateFormat.getTimeInstance()`:获取时间格式化器,默认使用中等格式。 - `DateFormat.getInstance()`:获取默认日期/时间...

    android 系统时间 完整版

    值得注意的是,`java.util.Date`类和`java.text.DateFormat`类都是Java标准库中的类,而非Android特有的。它们可以在任何Java环境中使用,包括Android。 此外,除了上述两个类之外,还可以使用`java.util.Calendar`...

    Java日期时间使用总结及项目中遇到的问题

    因为`Date`和`Calendar`类不是线程安全的,所以在多线程环境中使用时需要额外注意同步。另外,`SimpleDateFormat`是不可变的,但它的内部`DateFormat`是可变的,因此在多线程环境下,建议每个线程都拥有自己的`...

    java 时间格式转化 pdf

    根据提供的文件信息,本文将详细解释Java中时间与日期格式化的相关知识点,包括如何使用`java.text.DateFormat`类以及`java.text.SimpleDateFormat`类来进行日期格式的定制化处理,并且会额外介绍`java.util....

    获取当前时间

    - 使用 `DateFormat` 进行格式化和解析时需要注意国际化问题,因为不同地区对于日期和时间的表示方式可能有所不同。 3. **性能考虑**: - 在高并发或多线程环境下使用 `DateFormat` 时,由于它是非线程安全的,...

    Java中如何使用日期对象

    #### 使用DateFormat进行格式化 `java.text.DateFormat`是一个抽象类,用于以特定的格式转换日期和时间。它提供了静态方法来获取预定义的日期和时间格式器,如`getDateInstance()`和`getDateTimeInstance()`。这些...

    由浅入深解析 SimpleDateFormat

    在使用 SimpleDateFormat 时,需要注意以下几点: 1. SimpleDateFormat 是线程不安全的,因此在多线程环境下使用需要特别注意。 2. 创建 SimpleDateFormat 实例需要消耗大量的资源,因此应当尽量少创建实例。 3. ...

    Java处理时区的注意事项

    总结来说,处理Java中的时区需要注意以下几点: 1. 明确了解`TimeZone.getDefault()`获取的是操作系统的默认时区。 2. 在跨时区的数据交换中,确保统一设定时区,以避免时间偏差。 3. 使用`SimpleDateFormat`时,...

    SpringCloud实用篇02.pdf

    在使用 Nacos 配置管理时,我们需要注意以下几点: * 项目的核心配置,需要热更新的配置才有放到 Nacos 管理的必要。 * 基本不会变更的一些配置还是保存在微服务本地比较好。 * 在使用 Nacos 配置管理时,需要确保 ...

    java中时间类Date和Calendar的使用

    在`dateFormat()`方法中,使用这两个方法分别获取了日期和日期时间的格式化对象,并将当前日期和时间格式化后输出。 `SimpleDateFormat`是`DateFormat`的子类,允许程序员指定日期和时间的格式。在`...

Global site tag (gtag.js) - Google Analytics