首页 新闻 会员 周边 捐助

java 线程安全

0
[已解决问题] 解决于 2015-06-26 10:14

场景:

多线程执行如下操作:根据用户名查询用户积分,如果积分表没有记录,插入一条初始记录,有则更新。

问题:

并发情况下会出现多个线程都没有发现记录,结果一个用户名插入了多条初始记录。

这种情况有什么好的解决方案吗

司幸的主页 司幸 | 菜鸟二级 | 园豆:319
提问于:2015-06-15 17:46
< >
分享
最佳答案
0

如果是SQL数据库,

1.使用事务,在新增用户时,同时初始化积分数据。

2.使用事务,更新积分记录

如果是NoSQL数据库,将用户和积分放到一个聚合中,可保证操作的原子性。

奖励园豆:5
not-engough-minerals | 菜鸟二级 |园豆:207 | 2015-06-15 22:16

现在用的是sql。

嗯,其实最好的实现方式就是有个单线程做初始化的工作。

只不过现在情况,这部分代码跟用户那个系统还不是一个系统。 也就是积分是我这边单独管理的, 而计算积分的源数据是从别的地方发来的。 现在一些东西还没确定,乱糟糟的。

我就是想不约定他们的情况下,我这边有没有用其它方式保证这个地方的线程安全。

司幸 | 园豆:319 (菜鸟二级) | 2015-06-15 22:58
其他回答(2)
0

在处理这个行为的地方加一把锁,这样每次仅有一个线程可以访问这一块。

angelshelter | 园豆:9914 (大侠五级) | 2015-06-15 21:39

这种不行,加锁没意义啊,我加锁就没多线程了,其它不是初始化这条记录的代码也得等,

支持(0) 反对(0) 司幸 | 园豆:319 (菜鸟二级) | 2015-06-15 22:49
0

线程安全只能加锁,也就是线程同步

| 园豆:380 (菜鸟二级) | 2015-06-18 08:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册