Мне интересно, как именно «синхронизировано» работает в java.
Допустим, я моделирую настольную игру, состоящую из нескольких полей. Я реализую поля как класс (Field) и доску как класс (Board), который содержит ряд полей. Скажем далее, я смоделировал метод moveTo(Player pl) в поле, чтобы игрок мог перейти на это поле. Каждый игрок представлен нитью.
Хотя все потоки должны выполнять некоторые действия одновременно (например, бросать кубики), в каждый момент времени должен двигаться только один игрок.
Как я могу это гарантировать? Достаточно ли синхронизировать метод moveTo(Player pl)? Или мне нужен каскадный метод в Board, чтобы убедиться, что только один игрок движется одновременно? (Или есть лучшее решение)?
Подводя итог:
будет ли "синхронизированный" блокировать метод в КАЖДОМ объекте, который имеет этот метод, или синхронизированный заблокирует метод только в объекте, который используется в данный момент?
И если второй является case: есть ли простой способ заблокировать метод для каждого объекта, в котором реализован этот метод?
Спасибо!!!
synchronized
никогда не блокирует функцию, и точка. Вы можете всегда блокировать только объект. С методом экземпляра этоthis
. В случае статического метода это объект класса, в котором определен метод (MyClass.class). - person Mark Peters   schedule 03.01.2011