举例,用户购买商品了,那么要扣钱吧,代码这样:
private static object locker = new object(); public void Buy() { lock(locker) { var member = 获取会员(); if(member.money>= 商品.价格)
{
member.money -= 商品.价格; //其他操作
保存会员();
} } }
这里是一定要用lock的吧?大家是不是也是这么做的。
可是我突然发现用的全局locker,这样的话有多个用户同时购买,那么岂不是只能有1个用户在购买,其他都被阻挡了?这个问题大家是怎么做的啊?
private readonly object locker = new object()
这样子每个实例都lock自己的locker了,保证同一个实例同时只能有一个线程执行lock内的代码。但不同的类实例可以同时执行操作
这样不是和不lock类似了么,高并发的时候仍然会有安全隐患啊,例如1个用户请求多次,结果导致了2个线程同时进入了扣钱的逻辑,最终致使只扣了一次钱却交易成功了2次。
@wdwwtzy:
可以保证一个用户只存在一个实例,就不会出现你担心的问题了。
例如可以声明一个static 的Dictionary来存放用户实例,在需要用户实例时从这个字典中查,保证一个用户至于一个实例存在。
如果用户多的话,还需要定时,从Dictionary中清除不活动用户实例
@玉开: 感觉这复杂化了....我觉得这个问题大家都应该会遇到吧,就是想看看大家都是怎么做的
@wdwwtzy:
在数据库中用事务控制
我觉得这样的操作,应该放到数据库里面,使用单据状态和事务来保证扣款的完整性。
学习了。 。。
这个需要多线程了把!!
lock的作用是解决多线程的冲突的问题,楼主的描述应该用数据库事物来解决。