項目中遇到的一個多線程問題

多線程問題spring

  今天在項目中測試高併發狀況,接口是否是會出BUG,果真,功能模塊中的點贊接口出現了問題,使用Jmeter進行併發測試,100個線程數同時發送請求,果真程序出現了問題數據庫

  數據庫中出現多條同一我的點贊一篇帖子的記錄(果真程序出現了問題)!!!多線程

  解決思路:併發

 

  1. @Override
  2. @Transactional(rollbackFor = Exception.class)
  3. public synchronized void like(Dto paramDto) throws Exception{
  4. LikesVo likes=likesDao.select(paramDto);
  5. try {
  6. if (likes == null) {
  7. likesDao.insert(paramDto);
  8. postDao.addLike((int) paramDto.get("postId"));
  9. } else {
  10. likesDao.delete(paramDto);
  11. postDao.cancelLike((int) paramDto.get("postId"));
  12. }
  13. }catch (Exception e){
  14. throw e;
  15. }
  16. }  

 

 

 

使用synchronized將方法加鎖,多個線程訪問的時候,使用線程1訪問的時候,線程2不能訪問,只能有一個線程可以點贊,或者取消點贊ide


 

思考爲何會出現這個問題呢?高併發

若是不加synchronize的狀況下,spring進行ioc,在容器中只會生成一個實例,因此當多個線程訪問該方法的時候,當線程1進入到5行,線程2進入到5行的時候,likes可能仍是爲空,線程1和線程2同時進入第7行,進行了點贊,而後數據庫中就存在了兩條記錄,而後線程3進入到4的時候調用select方法,DAO層調用的是selectOne,因此會報錯,拋出異常post


 

從而引出一個問題,spring的IOC是否是都是單例的,若是上述的方法是每一個線程都生成一個實例,是否是會出現不同的狀況測試

相關文章
相關標籤/搜索