案例還原:
在高併發調用接口傳輸局是,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