开发者社区> 问答> 正文

Spring Boot:体系结构:在玩家之间共享对象

亲爱的,

我正在开发游戏,并希望将Board对象提供给在其中玩游戏的玩家。

到目前为止,一次只能玩1个游戏,但是我已经遇到了以下问题:

致电时:

@GetMapping({ "/judge/" })
public String judge(Model model,
        @RequestParam(value = "id", required = true, defaultValue = "World") final String hash) {

    ColorsTaken user = colorsTakenRepository.findByHash(hash);

    Board board = BoardController.getInstance().getBoard(gameHash);

    ...

    model.addAttribute("board", board);
    model.addAttribute("user", user);

    return "judge";

}

法官(...)的并发通话受到干扰,玩家A进行法官(...)的通话呈现了玩家B同时在进行的通话...

我通过使用ReentrantLock并锁定了调用,直到render.sjp呈现为止,“解决”了这个问题,但这远不是一个优雅的解决方案...

此外,一旦会有不同的并发游戏,则:

board.getLock().lock();

如果使用其他板对象并且将锁定设为静态,则呼叫将通过,这是我不应继续使用此“解决方案”的警钟...

(还有一种方法:

@GetMapping({ "/board/" })
public String board(Model model,
        @RequestParam(value = "id", required = true, defaultValue = "World") final String hash) {

呈现板,

如果我要为这些调用使用静态ReentrantLock,则所有玩家都需要等到所有并发板都呈现出来,这根本不是一个好的解决方案...)

(如果有100个并发游戏,则100 * 4人将需要等待,直到所有棋盘都呈现完毕,这简直是错误的……)

现在,我该怎么办呢?

棋盘对象应该在4个玩家之间共享(对其他玩家来说,任何更改都应该可以使用),但游戏1的玩家A不应知道游戏2的玩家F,但是(当然)游戏1的所有更改应该对游戏1的B,C和D玩家可用...

我显示的代码来自:

@Controller
public class HelloController {

我应该使用哪种体系结构而不必依赖ReentrantLocks?

最好的问候和感谢,

问题来源:Stack Overflow

展开
收起
montos 2020-03-25 23:10:06 374 0
1 条回答
写回答
取消 提交回答
  • 显然,对@Controller方法的并发调用是在不同的线程中处理的:

    如前所述这里 ...

    深入挖掘法官(...)要求进行干预的原因是因为他们提出了以下要求:

    Green: ${board.greenName}: ${board.getPlayerString(0, user)}<br /> <br /> 
    Blue: ${board.blueName}: ${board.getPlayerString(1, user)}<br /> <br /> 
    Red: ${board.redName}: ${board.getPlayerString(2, user)}<br />  <br /> 
    Yellow: ${board.yellowName}: ${board.getPlayerString(3, user)}<br /> <br />
    

    并且在公共Board对象中更改了“ greenName”,“ blueName”,...,如果将使用不同的Board对象进行调用,则这些调用将由不同的线程处理并修改不同的Board对象(如果这些调用源自玩家来自不同的委员会...)

    回答来源:Stack Overflow

    2020-03-25 23:10:51
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多