记录一下今天出现的问题,前端页面点击本周或本月时,会报一个multiple points的错误,起初我以为是我后端接收与前端传的类型不符,后面查了一下才发现,是因为SimpleDateFormat在多线程环境下,是线程不安全的,所以我在多线程环境中public了SimpleDateFormat的实例,就因为定义了这个全局的SimpleDateFormat对象,才会出现这个问题。
给大家看段错误的实例代码
package com.cjxjy.ccs.prod.service.impl; import java.text.SimpleDateFormat; import java.util.*; @Service @Slf4j public class ITbQualityOverviewServiceImpl implements ITbQualityOverviewService { Date date = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:ss:mm"); public static List<String> demo1(String stratDate,String endDate){ // 示例代码1 } public Map<String, Object> demo2(String stratDate,String endDate){ // 示例代码2 } }
这段代码我简化了,两个demo里如果都用到了这个SimpleDateFormat对象,那么就会报multiple points的错误,出现这种情况是在多线程的环境下
解决办法:
1、建议在每个方法中都new一个新的SimpleDateFormat对象,这样子就可以避免这种问题。
2、也可以使用保存线程局部变量的ThreadLocal对象来保存每一个线程的SimpleDateFormat对象,小编主要说说第二种的使用,针对上述代码做的改变。
注意:
在多线程环境下,一定要注意共享变量的线程安全问题,如无特殊必要,建议不要随便定义静态公共变量,如果非要定义,建议考虑好多线程的问题!
标签:lang,java,String,SimpleDateFormat,报错,线程,多线程,public From: https://www.cnblogs.com/yyk-/p/17076954.html