亲爱的
我正在开发游戏,并希望将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。
答案 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对象(如果这些调用来自不同委员会的球员...)