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

时间:2020-03-14 15:42:17

标签: java 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人需要等到所有棋盘都呈现出来,这简直是错误的...)

现在,我该怎么办?

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

我显示的代码来自:

@Controller
public class HelloController {

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

最诚挚的问候和感谢,

S。

2 个答案:

答案 0 :(得分:0)

共享数据应放在mysql和postgresql之类的数据库中,而不是放在应用程序内存中。

答案 1 :(得分:0)

显然,对@Controller方法的并发调用是在不同的线程中处理的:

here ...

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

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对象(如果这些调用来自不同委员会的球员...)