我学长要求我在学校的小程序里做一个组队的功能,学生发帖可以发起组队贴,这样可以找到同好 下面是我写的方法的代码,学长希望将 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 救一救
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.