网站模板库
  • 首页
  • web前端工具
    • HTML/JS转换工具
    • JS/HTML格式化工具
    • 字母/英文大小写转换工具
    • robots.txt文件生成工具
    • Js压缩/格式化工具
    • Css在线压缩工具_代码格式化
  • 关于我们
    • 免责声明
    • 联系我们
    • 广告服务
    • 服务项目
    • 关于我们
    • 网站轮播
    • 公告
    • 成都优优科技专用
    • 按行业分类
  • web学院
    • 服务器教程
    • 学习资料
      • 基础书籍
      • 交互书籍
      • 入门教程
      • 特效分类
    • 案例分享
    • web资讯
  • 网页特效
    • 图片特效
    • 导航特效
    • 滑动按钮
    • 表单特效
    • 文字特效
    • 弹窗特效
    • 其他特效
  • 织梦模板
    • 科技/电子/数码/通信
    • 文化/艺术/广告/传媒
    • 装修/设计/家居/家具
    • 基建/施工/地产/物业
    • 餐饮/酒店/旅游/票务
    • 食品/果蔬/饮料/日用
    • 服饰/珠宝/礼品/玩具
    • 摄影/婚庆/家政/生活
    • 运动/健身/体育/器材
    • 学校/教育/培训/科研
    • 美容/保健/医院/医疗
    • 金融/财税/咨询/法律
    • 政府/组织/集团/协会
    • 汽车/物流/交通/搬运
    • 机械/设备/制造/仪器
    • 化工/环保/能源/材料
    • 农业/畜牧/养殖/宠物
    • 其他模版
    • IT/软件/信息/互联网
  • 手机模板
    • 手机APP模板
    • 微信小程序模板
    • wap
  • 网站模板
    • joomla模板
    • Drupal模板
    • z-blog模板
    • EyouCms模板
    • Bootstrap模板
    • 帝国cms模板
    • CmsEasy模板
    • MetInfo模板
    • 购物商城模板
      • Shopify主题
      • PrestaShop主题
    • 后台模板
    • 纯HTML模板
    • ecshop模板
    • phpwind模板
    • pbootcms模板
    • phpcms模板
    • wordpress模板
    • discuz模板
  • 教程
    • 织梦教程
    • Discuz教程
    • WordPress教程
    • Phpcms教程
    • Phpwind教程
    • ECShop教程
    • Joomla教程
    • Drupal教程
    • zblog教程
    • EyouCMS教程
    • 帝国cms教程
    • MetInfo教程
    • CmsEasy教程
登录
当前位置:网站模板库 > web学院 > 案例分享 > 我的这个加入组队帖子的方法如何改造成双重检查锁形式?
admin 案例分享 2023-05-28 10:32:20

我的这个加入组队帖子的方法如何改造成双重检查锁形式?

我的这个加入组队帖子的方法如何改造成双重检查锁形式?,第1张

我的这个加入组队帖子的方法如何改造成双重检查锁形式?,第2张

我学长要求我在学校的小程序里做一个组队的功能,学生发帖可以发起组队贴,这样可以找到同好 下面是我写的方法的代码,学长希望将 synchronized 代码块改成双重检查锁的形式,我看了我以前的笔记,发现双重检查锁一般是用于单例模式中的,而不知道怎么将这个类改成单例模式的样子,实在不会了来问问

@CrossOrigin
@RestController
@Slf4j
@RequestMapping("/planet")
public class TeamController implements Teamable {

    @Resource
    MongoTemplate mongoTemplate;

    @Autowired
    ZKCourseCalling courseCalling;

    private Runtime runtime;

    @Override
    @ApiOperation("加入组队的帖子")
    @PostMapping("/teamUpWith")
    public R teamUp(@RequestParam String planetId, @RequestParam("weChat") String weChat){
        String openId = UniversityInterceptor.getOpenId();
        R userInfo = courseCalling.getUserInfo(openId);
        Object data = userInfo.getData().get("userInfo");
        User user = JSON.parseObject(JSON.toJSONString(data), User.class);
//        user = new User();
//        user.setOpenid("test");
//        user.setAvatarUrl("test");
        Planet planet = mongoTemplate.findById(planetId, Planet.class);
        if(planet==null){
            return R.error().message("没有找到该帖子");
        }
        Group group = planet.getGroup();
        if(group.getInNum().equals(group.getTotalNum())){
            return R.error().message("组队人数已满");
        }
        synchronized (this){
            Member member = new Member();
            member.setOpenId(user.getOpenid());
            member.setAvatarUrl(user.getAvatarUrl());
            member.setWechat(weChat);
            List<Member> memberList = group.getMemberList();
            memberList.add(member);
            group.setMemberList(memberList);
            group.setInNum(group.getInNum()+1);
            mongoTemplate.updateFirst(Query.query(Criteria.where("_id").is(planetId)),Update.update("group",group), Planet.class);
        }
        return R.ok();
    }
}

Planet 是帖子对象,Group 是组队属性,member 是存储具体组队对象的属性,注释的三行代码是创建 User 对象用于测试的代码,可以无视,synchronized 代码块上做的事就是取得帖子对象并做判断,代码块中往帖子对象中的 Group 属性赋予对应值最后更新数据库,也就是正式的加入组队方法。 就这些了,在线等 dalao 救一救

----------------------- 以下是精选回复-----------------------

答:可能是让你在 synchronized 中再查一次判断一次组队人数满没满?就是只有锁住的代码块会改变数量,在当前线程拿到锁时,上一个拿到锁的线程已经将组队人数搞满的。你可以多同时请求一下加入组队,会看到数据库中组队字段的人数超出设置的限制了。
答:没用过 mongodb
mongodb 没有行锁之类的吗
为啥要代码锁 锁 this 不就是全局都限制了,然而 planetId 不同的时候并不需要锁
答:双重锁的话,本质是拿到锁后要操作的东西不一定是最新状态,所以要再临界区里再读取一次,获取操作对象最新的状态并再次校验

你这个例子里就是两个人同时拿到一个 group ,
a 上锁,加入,保存,解锁
然后 b 再上锁,但是 b 操作的 group 对象还是 a 保存前的那个 group ,并不知道 a 已经加入并保存了,
所以要再读取一次数据库拿到最新的 group 再进行操作
答:用 redis incr... +1 大于总人数,那么就放弃。
答:多个线程操作数据库的时候,组队人数可能会多出,应该是在 sync 里面再写个"组队人数已满"的判断吧
答:我理解的双重检验是在正逻辑里做容错,你用反逻辑直接返回的思路和这个模式是反的

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 我的这个加入组队帖子的方法如何改造成双重检查锁形式?

admin 钻石

分享到:
上一篇
R710, DL380 G7 这代的二手服务器当作公司的生产环境服务器可用性靠谱吗?
下一篇
DigitalOcean 炸了? 最近有点不稳定

相关推荐

js 有没有好用的根据模板图片生成分享图的工具?

js 有没有好用的根据模板图片生成分享图的工具?

学数据分析一个月了, Excel 和 sql 学完了,能找到数据分析相关工作吗?统招大专, 30 岁,文科。。。。

学数据分析一个月了, Excel 和 sql 学完了,能找到数据分析相关工作吗?统招大专, 30 岁,文科。。。。

求一个正则匹配写法

求一个正则匹配写法

关于 CI 框架表单数据提交后在哪里处理

关于 CI 框架表单数据提交后在哪里处理

0条评论

发表评论 取消回复

要发表评论,您必须先登录。

提供最优质的资源集合

立即查看 了解详情
网站模板库

主题/付费下载/查看/余额管理/自定义积分,集成支付,卡密,推广奖励等。

本站导航
  • 链接标题
友情链接
  • 链接标题
快速搜索
本站由钛宇宙强力驱动
友情链接:
    商业源码网蜀ICP备2023005044号
    网站模板库
    • 登录
    • 注册
    网站模板库
    • 首页
    • web前端工具►
      • HTML/JS转换工具
      • JS/HTML格式化工具
      • 字母/英文大小写转换工具
      • robots.txt文件生成工具
      • Js压缩/格式化工具
      • Css在线压缩工具_代码格式化
    • 关于我们►
      • 免责声明
      • 联系我们
      • 广告服务
      • 服务项目
      • 关于我们
      • 网站轮播
      • 公告
      • 成都优优科技专用
      • 按行业分类
    • web学院►
      • 服务器教程
      • 学习资料►
        • 基础书籍
        • 交互书籍
        • 入门教程
        • 特效分类
      • 案例分享
      • web资讯
    • 网页特效►
      • 图片特效
      • 导航特效
      • 滑动按钮
      • 表单特效
      • 文字特效
      • 弹窗特效
      • 其他特效
    • 织梦模板►
      • 科技/电子/数码/通信
      • 文化/艺术/广告/传媒
      • 装修/设计/家居/家具
      • 基建/施工/地产/物业
      • 餐饮/酒店/旅游/票务
      • 食品/果蔬/饮料/日用
      • 服饰/珠宝/礼品/玩具
      • 摄影/婚庆/家政/生活
      • 运动/健身/体育/器材
      • 学校/教育/培训/科研
      • 美容/保健/医院/医疗
      • 金融/财税/咨询/法律
      • 政府/组织/集团/协会
      • 汽车/物流/交通/搬运
      • 机械/设备/制造/仪器
      • 化工/环保/能源/材料
      • 农业/畜牧/养殖/宠物
      • 其他模版
      • IT/软件/信息/互联网
    • 手机模板►
      • 手机APP模板
      • 微信小程序模板
      • wap
    • 网站模板►
      • joomla模板
      • Drupal模板
      • z-blog模板
      • EyouCms模板
      • Bootstrap模板
      • 帝国cms模板
      • CmsEasy模板
      • MetInfo模板
      • 购物商城模板►
        • Shopify主题
        • PrestaShop主题
      • 后台模板
      • 纯HTML模板
      • ecshop模板
      • phpwind模板
      • pbootcms模板
      • phpcms模板
      • wordpress模板
      • discuz模板
    • 教程►
      • 织梦教程
      • Discuz教程
      • WordPress教程
      • Phpcms教程
      • Phpwind教程
      • ECShop教程
      • Joomla教程
      • Drupal教程
      • zblog教程
      • EyouCMS教程
      • 帝国cms教程
      • MetInfo教程
      • CmsEasy教程

      弹窗标题

      这是一条网站公告,可在后台开启或关闭,可自定义背景颜色,标题,内容,用户首次打开关闭后不再重复弹出,此处可使用html标签...