hi_kevin 2012-08-30 18:25
浏览 299
已采纳

分布式环境下并发加锁问题

多线程问题:

例如某公司共生产了100台电脑,找了三个一级代理商(A1、A2、A3)帮其销售,而A1、A2、A3又分别找其自己的二级代理商帮其销售(B1、B2、B3、B4、B5),
B1、B2、B3、B4、B5又找其三级代理商帮其销售(C1、C2、C3、C4),D1、D2……代表消费者,ABCD之间的关系由图中箭头所示。

[img]http://dl.iteye.com/upload/picture/pic/117657/38c9c231-1b86-3269-914b-6b3be5208424.png[/img]

每个代理商可以销售的最大值分别是图例中所标示的值,但每个代理商销售的总和不能超过其上级所表示的值(即:A1的实际销售量+A2的实际销售量+A3的实际销售量<=100,B1的实际销售量+B2的实际销售量<=A1(80))
,其余级别同理,但每个代理商的最大销售量可以修改(增加或减小)

场景一:
D1购买20台电脑,则C1剩余20,B1剩余40,A1剩余60,厂家剩余80,此时A2直接向厂家订购90台,则会提醒货源不足,同理此时如果D2购买30台,因为C1最多还会卖20台,所以也会提示D3货源不足。

场景二:

B2直接从A1购买60台,则A1最多在再卖20台,经销商剩余40台,此时若D1购买30台,则会提示货源不足(因为A1最多只能在卖20台),同理B3购买50台也会提示货源不足(因为经销商还剩下40台)

场景三:

D1,D2,D3购买电脑的同时,减少A1的最大销售量,降为70,此时程序该如何控制,如何保证同步

现在伪码如下
[code="java"]
//购买电脑
public void buyComputer(User buyer){
int buyCount = buyer.getBuyCount();

boolean flag = 递归判断上级剩余量是否还够可以购买

if(flag){//表示可以购买

         lock.lock();
    购买电脑,递归修改其上级的最大购买量
    更新数据到数据库
   lock.unlock();

}else{
    提示货源不足
}   

}
//修改最大值

public void updateMax(User user , int max){
user.setMax(max);
更新数据库

}

[/code]


问题一:如上述三个场景:在分布式环境下如何处理?

问题二:多人同时购买时候是不是必须要顺序执行?有没有其它更优方法?

欢迎探讨 谢谢!

  • 写回答

4条回答 默认 最新

  • Dead_Knight 2012-08-31 15:28
    关注

    标题是分布式环境,电脑总数量固定,并且电脑售出时,需要修改各经销商最大销售量。
    本人提供方案如下:
    1.把电脑数量以及经销商最大销售量统一到一个server中。如a
    2.各分布式应用在获取数量时统一访问a,由a集中处理并返回当前最大数量值
    3.a统一处理数量锁机制控制并发

    如果不是分布式应用,直接通过多线程就可以处理了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的