java 锁的问题

iloveai8 2014-04-03 12:02:48
需求:游戏中有竞技场,每个角色在竞技场都可以参加挑战,并且当自己排名低于被挑战者的时候,如果战胜,就会更换到被挑战者的排名位置,有可能会发生情况:
A挑战C的时候,B也同时挑战C,A排名低于C,B排名也低于C,同时A,B都战胜C的情况;
A挑战B的时候,B也同时挑战C,A战胜,B也战胜等。
这些情况该如何加锁的问题?
...全文
434 19 打赏 收藏 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xlight2023 2014-06-09
  • 打赏
  • 举报
回复
实时游戏,服务器socket实现,这个可能发生,需在更新排名结果处加锁一个一个执行; 非实时游戏,这个需要是不行的,必须一个人只能同时被另一个人挑战;
Java精选 2014-06-09
  • 打赏
  • 举报
回复
暮雪初阳 2014-06-08
  • 打赏
  • 举报
回复
制定规则:排名高不能挑战排名低,A挑战B的时候,B也同时挑战C,A战胜,B也战胜等==a>b>c??????我素什么都不懂的小白,求指教
OYB123456 2014-06-07
  • 打赏
  • 举报
回复
给被挑战者加个锁吧 不能同时被2个人挑战。 1 2 3 4 5 5 挑战3,3挑战1 如果都赢了 排名就是 3 2 5 4 1
yuhouqingchen_2648 2014-06-07
  • 打赏
  • 举报
回复
引用 14 楼 momoyssy 的回复:
我觉得这种混战排名肯定乱,打个比方,A赢了B,B赢了C,C赢了A,那最后谁是怎么排呢?A第一?C不服;C第一?B不服;B第一?A不服。 当然,还是有一种情况解决的,就像现在的天天飞车,很好的解决了这个问题。每个人只关注自己的排名,比如说上面那种情况。在每个角色的排名里,他本人都是第二名,互不影响。在别人的排名里,都是第一或第三名,奖品只发给个人排名里的,那每个人都拿到第二名的奖品。不冲突。 如果照上面说的,可以混战而排名的话。 一,每个挑战对象在比赛的时候,不能接受或被接受挑战(就好比你网上玩斗地主,你在玩的时候,别人是进不来你的房间和你玩的) 二,允许比赛的时候被动接受第三者的挑战(这个感觉有点乱)。 无论上述哪种方式,排名按时间挑战结果。比如说A和C在比寒的时候,B挑战A。AC先结束,A赢A第一,这时候B赢了A,B第一,如果这时候C又赢了B,C第一。
大哥,你的逻辑有问题啊,a挑战b,b挑战c,c挑战a,他们之前总得有个先后顺序吧,比如a>b>c,那么请问a挑战c干嘛???a脑残???
raistlic 2014-04-04
  • 打赏
  • 举报
回复
如果根据挑战结果,排名变化的逻辑不同,还可能有更复杂的需求,比如下面这种排名: A B C D E F E挑战B,同时F挑战B,F先结束,胜,排名变成: A F C D E B 然后这时E也获胜: 一种设计是E的挑战白费了,名次不变,这样如果玩家注意到辛辛苦苦挑战白费,可能会不爽。 另一种更合理的逻辑是E挑战成功后排名变成: A F E C D B 相当于E名次窜到CD之前,而CD的名次向后顺延。这种设计的合理之处在于“任何一个玩家X,如果他的名次在另一个玩家Y之前,那么他要么直接战胜过Y,要么战胜过战胜过Y的玩家Z,即X直接或间接强于Y”。E挑战B时,B排在CD之前,即E挑战B时B强于CD,那么战胜了B的E也强于CD,所以把E排在他们前面,而对于C和D,由于有两人同时战胜了强于他们的B,所以他们的名次被向后顺延。 这里会产生更复杂的情况,因为C和D可能同时挑战了别人和被别人挑战,所以当E战胜,发现B不在原位时,不能单纯以CD作为参照物往上爬,同样的道理F作为参照物也是靠不住的,——事实上没有一个玩家是靠得住的参照物,因为大家都可能在变;也不能单纯用E挑战B时他们的排位差值,因为CDF都可能在E结束之前爬得更高,同时也可能有下面的玩家爬上来挤进从E到F的这一段内…… 这种复杂需求要解决也不是没有办法,比如当任何一个玩家X在挑战比他高的玩家Y时,可以往Y的手里放一个参照物,参照物有可变的属性标明假如挑战获胜是互换还是爬到参照物的后一名,当Y因为各种原因要换位时,参照物传递给下一个合适的玩家………
raistlic 2014-04-04
  • 打赏
  • 举报
回复
详细一点说,A挑战B,出结果A战胜了B,那么一个“如果B名次高于A,则A、B名次互换“的事件排入一个单线程队列,事件执行时检查A和B的名次,若满足条件则互换。单线程队列相当于对于其中的任何一个事件,事件执行时已经确保锁定了整个队列。 为什么要检查A和B的名次? 因为当 “如果B名次高于A,则A、B名次互换“ 这个事件排进队列时,无法判断是不是已经有名次低于A的C挑战B成功的事件排在了队列的前面。 这里还需要确保玩家在挑战列表内只能看到比自己名次高的挑战对象。
raistlic 2014-04-04
  • 打赏
  • 举报
回复
前段时间玩过一个《悟空去哪儿》的游戏,里面会有楼主说的情况。 我认为“开始挑战”的时间点的状态,和“挑战过程”的时间段的状态都不重要,挑战出结果的瞬间,可能会引发更新,这个更新不占时间,只要保证这个更新是以单线程队列的方式更新即可。
iloveai8 2014-04-04
  • 打赏
  • 举报
回复
挑战一个人,可能出现并发的情况!如果不加控制,容易出现排名混乱问题
iloveai8 2014-04-04
  • 打赏
  • 举报
回复
大家有没有考虑到 你在锁被挑战者的时候,同时自己也有可能也是被挑战者呢!
lliiqiang 2014-04-04
  • 打赏
  • 举报
回复
可以以被挑战者为锁.
momoyssy 2014-04-04
  • 打赏
  • 举报
回复
我觉得这种混战排名肯定乱,打个比方,A赢了B,B赢了C,C赢了A,那最后谁是怎么排呢?A第一?C不服;C第一?B不服;B第一?A不服。 当然,还是有一种情况解决的,就像现在的天天飞车,很好的解决了这个问题。每个人只关注自己的排名,比如说上面那种情况。在每个角色的排名里,他本人都是第二名,互不影响。在别人的排名里,都是第一或第三名,奖品只发给个人排名里的,那每个人都拿到第二名的奖品。不冲突。 如果照上面说的,可以混战而排名的话。 一,每个挑战对象在比赛的时候,不能接受或被接受挑战(就好比你网上玩斗地主,你在玩的时候,别人是进不来你的房间和你玩的) 二,允许比赛的时候被动接受第三者的挑战(这个感觉有点乱)。 无论上述哪种方式,排名按时间挑战结果。比如说A和C在比寒的时候,B挑战A。AC先结束,A赢A第一,这时候B赢了A,B第一,如果这时候C又赢了B,C第一。
三易的博客 2014-04-03
  • 打赏
  • 举报
回复
引用 4 楼 sunbo624 的回复:
更新战斗榜的时候 加锁就行
引用 5 楼 li_xiaolei 的回复:
个人感觉这些情况不应该通过锁来解决,而是制定的规则问题,比如针对第一种情况,假如A先战胜了C,现将A、C交换位置,然后B战胜了C,这时候可以判断A和B之前的排名,A排名比B靠前,可以将B放在A现在位置的后面,反之则把B放在A现在位置的前面。
同意4楼的说法,同时也同意5楼的说法,不过我更倾向5楼的说话。或者,C只能同时被一个角色进行挑战。
nealwang1019 2014-04-03
  • 打赏
  • 举报
回复
分两个组,胜组和负组,负组再排下。:)
lileibuaa22 2014-04-03
  • 打赏
  • 举报
回复
个人感觉这些情况不应该通过锁来解决,而是制定的规则问题,比如针对第一种情况,假如A先战胜了C,现将A、C交换位置,然后B战胜了C,这时候可以判断A和B之前的排名,A排名比B靠前,可以将B放在A现在位置的后面,反之则把B放在A现在位置的前面。
sunbo624 2014-04-03
  • 打赏
  • 举报
回复
更新战斗榜的时候 加锁就行
iloveai8 2014-04-03
  • 打赏
  • 举报
回复
这个是有可能发生的,客户端同时 A挑战B,B挑战C。我的理解是对2个对象同时上锁,不知道各位同仁是否有更好地建议!
啊帮BILL 2014-04-03
  • 打赏
  • 举报
回复
我感觉不能实现!这个逻辑有问题!
卡卡吉利 2014-04-03
  • 打赏
  • 举报
回复
一个人可以同时被多个人挑战?太乱了吧,体验也不好

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧