Java SimpleDateFormat在多线程并发环境下时间异常问题

public static final SimpleDateFormat FORMATTER = new SimpleDateFormat ( pattern: "yyyy-MM-dd HH:mm:ss");

新增一个全局Static的DataFormatter,并使用该Formatter重新生成了数据时间会导致时间在高并发场景中出现异常

问题原因:

如果在使用SimpleDateFormat时,用static定义,那么SimpleDateFormat变成了共享变量。SimpleDateFormat中的calendar就可以被多个线程访问到。执行format()时会修改calendar值,而这个修改将有可能会影响到其他线程。

// Called from Format after creating a FieldDelegate
    private StringBuffer format(Date date, StringBuffer toAppendTo,
                                FieldDelegate delegate) {
        // Convert input date to time field list
        calendar.setTime(date);
		...
	}

问题解决方案

解决方案一:SimpleDateFormat作为局部变量使用,在多线程执行函数中New一个SimpleDateFormat,保证每个线程独享一个对象,这种方式可以解决并发带来的问题,但性能较差。

解决方案二:使用JDK8的DateTimeFormatter替代SimpleDateFormat,线程安全的来处理时间的格式化问题(推荐方案):

DateTimeFormatter类被final修饰,且内部无任何可变的共享变量存在,因而是线程安全的。

Patterns for Formatting and Parsing
Patterns are based on a simple sequence of letters and symbols. A pattern is used to create a Formatter using the ofPattern(String) and ofPattern(String, Locale) methods. For example, "d MMM uuuu" will format 2011-12-03 as '3 Dec 2011'. A formatter created from a pattern can be used as many times as necessary, it is immutable and is thread-safe.


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值