日期:2014-05-17  浏览次数:20710 次

求一多线程问题(分布式并发环境下)


问题如下:

每个用户都可以拿苹果,但最多拿多少个由自己圈里的数字决定,
并且拿的个数不能超过上级剩余的个数,直到拿完为止

举例说明:如图中A、B、C、D、B1所示

例子1:比如A拿5个苹果,则B、C、D、相应都要减少5个,即B最多能拿20,C最多35,D最多95

例子2:比如C中此时剩余12个苹果,其余28个被其下面的其它用户或者自己拿走,此时 如果A(10个)和B1(5个)同时拿苹果,如果先处理的B1则提示A用户剩余7个,如果先处理的A则提示B1只能拿两个

我的初步想法是每个人拿的时候把相应的整条线加锁,等执行完后释放锁,但如果把整条线全部锁住后的效率问题,欢迎大家指教

------解决方案--------------------
提示一下你可以在每个线程了这要做:
CountDownLatch latch=new CountDownLatch(20);
该线程每取到一个苹果就进行一次countDown()操作。知道该线程的latch对象减少到0为之终止该线程。
latch.countDown();
latch.await();
------解决方案--------------------
可以按照你的思想写出来,执行一下就知道效率了。
如果你控制的好的话,应该没什么问题。
------解决方案--------------------
思路:
实体类:苹果篮子
class appleBasket{

private int apples=100;

public void synchronized getApples(int num){

if(apples>num){
apples-=num;
System.out.println(num+" apples were token by someone !")

}
else if(apples==0){
 System.out.println("no apple in bascket!")
}
else if(apples<num){
System.out.println("you take too much!")
}

}

}
------解决方案--------------------
这个问题有点意思。先说说我的理解。
用苹果说话好像不太直观。我用网络带宽来比喻。
比如说我有100M带宽,这时候我可以分别给3个不同的带宽,3个人的总和还是100,他们每个人都有自己的带宽封顶值,而我直接是100.就是说即使还有可用的带宽,如果他们达到了自己的封顶值,也不能再占用剩余的带宽,但是我是可以完全利用。原则上就算是我跟他们3个共享100M带宽,他们3个是有上限的共享的带宽。同理,他们还可以往下分带宽。
实现时要做一个做一个树状的数据保存状态。可以定义一个用户类,他有一个上级用户,还有N个下级用户。当这个用户要使用带宽时,除了要更新自己还剩下的可使用带宽,还要更新上级用户和下级用户的使用带宽。定义更新带宽方法,参数为要增减的带宽和上下级方向标志,和内容为调用上级用户的更新带宽方法(如果上级用户存在的话),更新自己的带宽,如果下级存在,如果下级上限带宽小于剩下的可使用带宽,并且当前是减带宽操作,则不处理,否则一样处理。
------解决方案--------------------
用到观察者模式实现吧,父节点保存子节点在LIST中,当子节点状态发生改变时,通知父节点更新其它子节点状态。很好实现的。