请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

并发安全问题的解决方案

老师,你好 最近在做一个学校里面小项目,涉及到管理员审核上传资料,如果审核通过会为用户增加积分。
这里为用户增加积分是不是存在并发安全问题呀,如果有多个管理员用户在审核同一个用户提交的不同内容时,是有可能存在并发安全问题吧?一般这种问题是怎么解决的呢?
我的想法:
1.使用synchronized类锁,但是这种性能貌似不是很好
2.基于cas机制来实现积分的更新
老师可以不可以提供一下其他的思路呢?

正在回答

1回答

张勤一 2020-09-16 16:33:28

super 同学你好:

    我理解你提出的问题,但是,其实这里的问题并不是并发问题,而是你没有真正的理解什么是“并发安全”,且也不清楚多实例部署的含义(多实例的情况下,synchronized 或 CAS 是不能起到作用的)。那么,这个审核用户内容的操作会不会有并发安全的问题呢?显然你可以忽略掉。原因是:

    (1)如果多个管理员审核的是相同的用户信息,那么,实际上,修改只会体现到数据库上。所以,应该是在数据存储层面解决多次审核的问题;

    (2)如果多个管理员审核的不是相同的用户信息,那么,就无所谓了,不会有任何影响,本来就不是相同的信息,分为不同的管理员审核会有什么问题呢?

    synchronized 是在一个实例的运行中处理多线程的竞争问题的,性能问题可以忽略掉,不至于说 JVM 的这个关键字会影响到性能;CAS 是乐观锁,也是单个实例在多线程并发修改变量的时候才会使用到的。而你这里所说的问题,与这两个特性无关。


    我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!

3 回复 有任何疑惑可以回复我~
  • 提问者 superLiuLiuLiu #1
    老师我举个例子吧 就是用户表中有积分这个列,如果一个用户提交了两个分享内容,然后恰好两个管理员分别审核不同的分享内容,在审核通过之后,需要为用户加积分(加积分需要先查原积分,然后更新积分到数据库中)这就有可能出现审核完成之后,只加了一次积分的现象实际上应该加两次积分。
    回复 有任何疑惑可以回复我~ 2020-09-16 16:56:56
  • 提问者 superLiuLiuLiu #2
    可能是我描述的不清晰,老师我一会可以把代码贴一下
    回复 有任何疑惑可以回复我~ 2020-09-16 16:59:53
  • 张勤一 回复 提问者 superLiuLiuLiu #3
    哦哦,这样是可能会存在问题的,不过,出现问题的概率是很低的。我个人建议使用 CAS 的方式去更新数据表,乐观锁的方式。
    回复 有任何疑惑可以回复我~ 2020-09-16 17:26:30
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信