Me pregunto cómo funciona exactamente "sincronizado" en Java.¿Qué hace exactamente "sincronizado"? Bloquear una función o bloquear una función de objetos?
Digamos que modelo un juego de tablero que consiste en una serie de campos. Implemento los campos como una clase (Campo) y el tablero como una clase (Tablero) que contiene un número de campos. Digamos además que modelé un método moveTo (Player pl) en Field, para que un jugador se mueva a ese campo. Cada jugador está representado por un hilo.
Aunque todos los hilos deben realizar algunas acciones simultáneamente (por ejemplo, rodando sus dados), solo debe haber un jugador que se mueva a la vez.
¿Cómo me aseguraré de eso? ¿Es suficiente sincronizar el método moveTo (Player pl)? ¿O necesitaría un método en cascada en el tablero para asegurarme de que solo un jugador se mueve a la vez? (¿O hay una mejor solución)?
Para llevarlo a la línea de fondo:
que "sincronizado" bloquear un método en el que cada objeto tiene este método o sería sincronizado bloquear un único método en el objeto que está actualmente en uso?
Y si es el segundo: ¿hay alguna manera fácil de bloquear un método para cada objeto que tiene implementado este método?
Gracias!
'synchronized' nunca bloquea una función, punto. Solo ** puedes ** bloquear ** un * objeto *. Con un método de instancia, es 'esto'. Con un método estático, es el objeto de clase en el que se define el método (MyClass.class). –
solo porque preguntaste por qué necesito multihilo: de hecho estoy implementando algún tipo de juego multiusuario "pacman" como una tarea. Cada jugador y cada fantasma debe ser un hilo. Sin embargo, debo verificar si un jugador golpea a un fantasma o viceversa después de cada paso. En este punto, a veces recibo excepciones que me dicen algo así como "Ghost-A quería eliminar Player-B del campo-XY, pero Player-B ya no estaba allí". Creo que este error proviene del hecho de que los movimientos de los hilos no estaban sincronizados. – speendo
La sincronización sería una solución a este problema. Pero no el único. – Falmarri