首页 新闻 搜索 专区 学院

请教,关于每个用户lock的问题

0
悬赏园豆:20 [已解决问题] 解决于 2018-01-16 10:44

举例,用户购买商品了,那么要扣钱吧,代码这样:

private static object locker = new object();
public void Buy()
{
    lock(locker)
    {
        var member = 获取会员();
       if(member.money>= 商品.价格)
{
member.money
-= 商品.价格; //其他操作
保存会员();
} } }

这里是一定要用lock的吧?大家是不是也是这么做的。

可是我突然发现用的全局locker,这样的话有多个用户同时购买,那么岂不是只能有1个用户在购买,其他都被阻挡了?这个问题大家是怎么做的啊?

wdwwtzy的主页 wdwwtzy | 菜鸟二级 | 园豆:226
提问于:2012-04-11 11:21
< >
分享
最佳答案
0

private readonly object locker = new object()

这样子每个实例都lock自己的locker了,保证同一个实例同时只能有一个线程执行lock内的代码。但不同的类实例可以同时执行操作

收获园豆:15
玉开 | 大侠五级 |园豆:8822 | 2012-04-11 13:26

这样不是和不lock类似了么,高并发的时候仍然会有安全隐患啊,例如1个用户请求多次,结果导致了2个线程同时进入了扣钱的逻辑,最终致使只扣了一次钱却交易成功了2次。

wdwwtzy | 园豆:226 (菜鸟二级) | 2012-04-11 13:48

@wdwwtzy: 

可以保证一个用户只存在一个实例,就不会出现你担心的问题了。

例如可以声明一个static 的Dictionary来存放用户实例,在需要用户实例时从这个字典中查,保证一个用户至于一个实例存在。

如果用户多的话,还需要定时,从Dictionary中清除不活动用户实例

玉开 | 园豆:8822 (大侠五级) | 2012-04-12 09:01

@玉开: 感觉这复杂化了....我觉得这个问题大家都应该会遇到吧,就是想看看大家都是怎么做的

wdwwtzy | 园豆:226 (菜鸟二级) | 2012-04-12 12:46

@wdwwtzy: 

在数据库中用事务控制

玉开 | 园豆:8822 (大侠五级) | 2012-04-12 12:47
其他回答(4)
0

我觉得这样的操作,应该放到数据库里面,使用单据状态和事务来保证扣款的完整性。

收获园豆:5
迷路中的路人甲 | 园豆:93 (初学一级) | 2012-04-11 14:13
0

学习了。 。。

KivenRo | 园豆:1722 (小虾三级) | 2012-04-11 16:01
0

这个需要多线程了把!!

小茶喏 | 园豆:274 (菜鸟二级) | 2012-04-11 20:11
0

lock的作用是解决多线程的冲突的问题,楼主的描述应该用数据库事物来解决。

passer.net | 园豆:219 (菜鸟二级) | 2018-01-16 12:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册