亲爱的,
我正在开发游戏,并希望将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
显然,对@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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。