I'm modelling a game where multiple players (threads) move at the same time. The information of where a player is located at the moment is stored twice: the player has a variable "hostField" that references to a field on the board and every field has an ArrayList storing the players that are currently located at this field.
I'm not very happy with the fact that I have redundant information, but I found no way avoiding that without looping through a big dataset.
However, when a player moves from one field to another, I'd like to make sure (1) the redundant information stays linked (2) nobody else is manipulating the field at the moment.
Therefore I need to do something like
synchronized(player, field) {
// code
}
Which is not possible, right?
What should I do? :)
A trivial solution would be
synchronized(player) {
synchronized(field) {
// code
}
}
However, make sure that you always lock the resources in the same order to avoid deadlocks.
Note that in practice, the bottleneck is the field, so a single lock on the field (or on a dedicated, common lock object, as @ripper234 rightly pointed out) may suffice (unless you are concurrently manipulating players in other, conflicting ways).