Уважаемые,
Я занимаюсь разработкой игры и хочу, чтобы объект "Доска" был доступен игрокам, играющим в нее.
Пока все хорошо для одной игры за раз, но Я уже сталкивался со следующей проблемой:
При звонке:
@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";
}
Параллельные звонки судье (...) мешали, и призыв игрока А судить (... ) обработал вызов, который выполнял игрок B в одно и то же время ...
Я "решил" эту проблему, используя ReentrantLock и блокируя вызов до тех пор, пока судья не будет обработан. jsp, но это далеко от элегантное решение ...
Кроме того, как только появятся разные параллельные игры, вызов:
board.getLock().lock();
будет проходить, если используется другой объект на доске и выполняется блокировка c это сигнал тревоги, который я не должен go включать с этим «решением» ...
(Существует также метод:
@GetMapping({ "/board/" })
public String board(Model model,
@RequestParam(value = "id", required = true, defaultValue = "World") final String hash) {
, который отображает плату,
если бы я использовал stati c ReentrantLock для этих звонков, все игроки будут Нужно подождать, пока не будут отображены все параллельные платы, что не является хорошим решением вообще ...)
(Если есть 100 одновременных игр, 100 * 4 людям придется подождать, пока все доски отображаются, и это просто неправильно ...)
Теперь, что мне делать вместо этого?
Объект Board должен быть разделен между 4 игроками (любые изменения в нем должны быть доступны другим игрокам), но игрок A игры 1 не должен знать игрока F игры 2, но (конечно) все изменения в игре 1 должны быть доступны игроку B, C и D игры 1 ...
Код, который я показал, взят из:
@Controller
public class HelloController {
Какую архитектуру я должен использовать, чтобы не полагаться на ReentrantLocks?
С уважением и благодарностью,
S.