案例还原:
在高并发调用接口传输局是,controller中的instance会莫名变成null值,导致存储到数据库中异常。
问题排查:
因为在controller中定义了实例变量,如:
@Controller
public class controlller{
private Instance instance;
@ResponseBody @RequestMapping(value = "/x", method = RequestMethod.POST) public ResponseResult x() {
instance = new Instance();
instance.setDate(new SimpleDateFormat());
Dao.insert(instance)
}
其中有两个问题:
1.多线程访问下,instance是singleton因此其中的实例instance再多个线程中是共享的,这样会出现窜数据的现象
2.当初因为new SimpleDateFormat()不是线程安全的,因此每次用时都会new 一个新的出来,但是new SimpleDateFormat()非常的耗费资源和时间,导致了多线程下的instance访问出问题
解决方案:
1.instance放到对应的函数中,变为局部变量
2.不再new SimpleDateFormat()而变为synchronized块共享SimpleDateFormat