FindBugs分析记录[H STCAL]Call to static DateFormat
来源:互联网 发布:java单例模型 编辑:程序博客网 时间:2024/05/04 12:19
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做成成员或者静态成员,上面已经说了,这样做是不安全的。
其实,出现这种问题的代码一般都长得差不多,典型的代码示例如下:
public class Test{ private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); public void method1(){ dateFormat.format(new Date()); } public void method2(){ dateFormat.format(new Date()); } )
再给个详细例子说明问题,看下面代码:
import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;public class Test{ private SimpleDateFormat dateFormat ; public static void main(String[] args) { SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd"); Date today = new Date(); Date tomorrow = new Date(today.getTime()+1000*60*60*24); System.out.println(today); // 今天是2010-01-11 System.out.println(tomorrow); // 明天是2010-01-11 Thread thread1 = new Thread(new Thread1(dateFormat,today)); thread1.start(); Thread thread2 = new Thread(new Thread2(dateFormat,tomorrow)); thread2.start(); } }class Thread1 implements Runnable{ private SimpleDateFormat dateFormat; private Date date; public Thread1(SimpleDateFormat dateFormat,Date date){ this.dateFormat = dateFormat; this.date = date; } public void run() { for(;;){// 一直循环到出问题为止吧。 String strDate = dateFormat.format(date); // 如果不等于2010-01-11,证明出现线程安全问题了!!!! if(!"2010-01-11".equals(strDate)){ System.err.println("today="+strDate); System.exit(0); } } }}class Thread2 implements Runnable{ private SimpleDateFormat dateFormat; private Date date; public Thread2(SimpleDateFormat dateFormat,Date date){ this.dateFormat = dateFormat; this.date = date; } public void run() { for(;;){ String strDate = dateFormat.format(date); if(!"2010-01-12".equals(strDate)){ System.err.println("tomorrow="+strDate); System.exit(0); } } }}
运行的结果如下:
Mon Jan 11 11:30:36 CST 2010Tue Jan 12 11:30:36 CST 2010tomorrow=2010-01-11
终于看到问题了,tomorrow=2010-01-11,错得很明显了。其实要避免这个问题方法很简单,不使用SimpleDateFormat,或者不使用成员变量/静态成员变量的SimpleDateFormat对象即可。
转至:http://www.cnblogs.com/hyddd/articles/1643978.html
- FindBugs分析记录[H STCAL]Call to static DateFormat
- 【Findbugs缺陷库】Call to static DateFormat
- FindBug:Call to static DateFormat
- 关于Call to static DateFormat 的Findbug警告思考
- Call to method of static java.text.DateFormat
- 解决Call to method of static java.text.DateFormat
- 解决Call to method of static java.text.DateFormat
- findbugs分析记录
- [hyddd的FindBugs分析记录][H B BC] Random object created and used only once
- FindBugs分析记录May expose internal representation by returning reference to mutable ob
- DateFormat错误记录
- 代码分析工具FindBugs
- FINDBUGS错误分析日志
- 代码分析工具 findbugs
- findbugs 错误分析
- findbugs 错误分析
- findbugs 错误分析
- findbugs 错误分析
- FORM的ENCTYPE="multipart/form-data" request.getParameter()获取不到值
- 最近两件大事和一些小目标
- ffmpeg移植到vs2008 之编译ffmpeg中的asm的过程
- ActivityGroup简介
- 软件技术博客
- FindBugs分析记录[H STCAL]Call to static DateFormat
- poj 2287 动态规划
- 使用类字面常量
- oracle dump文件
- Linux2.6--虚拟文件系统
- Java相对路径/绝对路径总结(转)
- 动态的 instanceof
- hdu 4597 Play Game (博弈dp)
- linux搭建邮件服务器