项目中遇到的一个多线程问题

多线程问题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是否是都是单例的,若是上述的方法是每一个线程都生成一个实例,是否是会出现不同的状况测试

相关文章
相关标签/搜索