zoukankan      html  css  js  c++  java
  • 项目中遇到的一个多线程问题

    多线程问题

      今天在项目中测试高并发情况,接口是不是会出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不能访问,只能有一个线程能够点赞,或者取消点赞


     

    思考为什么会出现这个问题呢?

    如果不加synchronize的情况下,spring进行ioc,在容器中只会生成一个实例,所以当多个线程访问该方法的时候,当线程1进入到5行,线程2进入到5行的时候,likes可能还是为空,线程1和线程2同时进入第7行,进行了点赞,然后数据库中就存在了两条记录,然后线程3进入到4的时候调用select方法,DAO层调用的是selectOne,所以会报错,抛出异常


     

    从而引出一个问题,spring的IOC是不是都是单例的,如果上述的方法是每个线程都生成一个实例,是不是会出现不一样的情况


     

     

     

  • 相关阅读:
    第三十四节(java-实现在线翻译)
    第三十三节(java-操作Excel实现企业级批量处理大数据)
    第三十二节( Java-实现体育彩票开奖系统)
    第三十一节(java-实现QQ空间访问量统计系统)
    第三十节(java-实现水印图片)
    使用VBA批量CSV转XLS(97-2003)
    WPF中Datagrid控件添加行号
    简单多播委托Demo
    使用Linq查找重复
    简单的操作符重载,笔记
  • 原文地址:https://www.cnblogs.com/zhangchiblog/p/8390515.html
Copyright © 2011-2022 走看看