多线程下调用SimpleDateFormat的问题
来源:互联网 发布:mac无法连接localhost 编辑:程序博客网 时间:2024/06/05 10:35
SimpleDateFormat类用于时间格式的处理:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);// 输出北京时间String currentNetworkTime = "2017-09-19";Date date_from_network = Constants.sdf.parse(currentNetworkTime);
结果:
date_from_network:Tue Sep 19 00:00:00 GMT+08:00 2017
parse可以将简单的时间字符串转换成标准的时间格式,然而
SimpleDateFormat不是线程安全的
做了这样一个测试,固定输入,开启100个线程进行时间格式转换:
for (int i = 0 ;i<100;i++){ Thread thread = new Thread(new Runnable() { @Override public void run() { String currentNetworkTime = "2017-09-19"; try { Log.i(CLASS_TAG, "currentNetworkTime:" + currentNetworkTime); Date date_from_network = Constants.sdf.parse(currentNetworkTime); Log.i(CLASS_TAG, "date_from_network:" + date_from_network); } catch (ParseException e) { e.printStackTrace(); } } }); thread.start(); }
然后其中一些线程会出现异常:
09-19 10:35:36.889 26529 27665 I ecm_ecms: ->EcmServiceManager:currentNetworkTime:2017-09-1909-19 10:35:36.890 26529 27665 I ecm_ecms: ->EcmServiceManager:date_from_network:09-19 10:35:36.890 26529 27665 I ecm_ecms: ->EcmServiceManager: date_from_network:Fri Sep 11 00:00:00 GMT+08:00 2201
第一次打印结果居然是空的,第二次打印结果居然是2201年!
当然最好的改法是把SimpleDateFormat重新做一次封装,然后替换:
import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class DateSyncUtil { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static String format(Date date)throws ParseException{ synchronized(sdf){ return sdf.format(date); } } public static Date parse(String strDate) throws ParseException{ synchronized(sdf){ return sdf.parse(strDate); } } }
后记:
一开始从日志里根本看不出什么问题,用日志里面的数据重新测试也无法复现,后来发现这部分代码在相同时间内调用了两次才怀疑是多线程并发引起的,然后从上层模拟多线程调用,发现当线程数量增大后结果竟然有一定随机性,增加打印,进一步缩小范围最后才定位到是SimpleDateFormat原因。
阅读全文
0 0
- 多线程下调用SimpleDateFormat的问题
- SimpleDateFormat多线程调用问题
- java.text.SimpleDateFormat多线程下的问题
- SimpleDateFormat多线程下的异常
- SimpleDateFormat导致的多线程问题
- 多线程下 SimpleDateFormat
- SimpleDateFormat多线程问题
- SimpleDateFormat多线程问题
- SimpleDateFormat在多线程下不安全
- 多线程下SimpleDateFormat使用出错
- 多线程下SimpleDateFormat使用出错
- SimpleDateFormat的问题
- SimpleDateFormat的使用问题
- SimpleDateFormat的并发问题
- SimpleDateFormat 的月份问题
- HashMap多线程调用下的死循环问题
- SimpleDateFormat 多线程环境下慎用,会报异常
- 高并发下的SimpleDateFormat
- Vue新手环境搭建
- 题目242-计算球体积
- [Linux/Ubuntu] vi/vim 使用方法讲解
- Javaweb项目图片上传实现预览
- squid 各种timeout配置项
- 多线程下调用SimpleDateFormat的问题
- 手机移动端浏览器或PC端浏览器莫名出现计算错误或莫名返回到登录界面等问题的解决.
- Spring框架基础梳理-1
- BZOJ 2653 可持久化线段树
- Linux笔记之shell脚本2:初次写shell脚本
- [ JDK ] 函数式接口 Predicate<T>
- three.js 与 webGL
- jquery中使用 delegate 代理 hover 失效
- Hadoop学习常见问题及答案整理(一)