由特定顺序内的不同线程并发访问资源对象

时间:2013-09-02 17:04:56

标签: java

假设我有一个包含纸牌游戏数据的GameServer对象。 4个客户端将使用Java RMI访问该对象的功能/数据,并且每个客户端都将自行修改游戏状态。在每个玩家进行移动之后,其他玩家应该能够检查Game对象的新状态。作为一种纸牌游戏,他们还必须遵循某个人应该在特定时间玩的特定顺序。

我的第一个猜测是使用ReentrantLock + Condition实现,但我不知道如何手动分配哪个玩家应该在前一个发布之后获取锁定。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:-1)

在服务器上,你有某种游戏状态,每个玩家只能在轮到你时修改。我们称之为状态变量gs;它的类型无关紧要。

处理有序行为的最实用的方法是让gs类有一个表示轮到它的字段(int nextPlayer)。您接受来自玩家的轮流命令的服务器RMI方法将检查nextPlayer字段并确保它是发送播放器,如果不是(可能是IllegalStateException)则返回错误。 RMI的转弯方法和阅读方法应该是synchronized(gs),因为你需要确保游戏状态是自动更新的(包括下一轮),你就不会有太多争用有四名球员。

答案 1 :(得分:-2)

信号量列表,每个线程一个?

每个线程/播放器在列表中等待自己的信号量。当它获得一个单元时,它“播放”,然后发出下一个线程/播放器的信号量信号,然后循环再次等待它自己的信号量。如果玩家折叠或其他任何东西,它的线程可以安全地从列表中删除自己,然后将该单元重新放回信号量。

在启动时,向一个玩家投掷一个单位来处理/无论如何。

在一个设计中解决了互斥和游戏秩序。

它会起作用。

它并不凌乱。