Java incorpora el mecanismo synchronized
para garantizar la atomicidad y exclusión mutua en entornos concurrentes. Utilizando la palabra clave synchronized
junto con un lock implícito, Java permite acceso exclusivo al código que manipula datos compartidos, asegurando que los métodos que acceden a estos datos estén sincronizados sobre el mismo lock. Cada objeto en Java posee un lock, heredado de la clase Object
. Este mecanismo asegura que solo un hilo a la vez pueda ejecutar un bloque de código sincronizado, lo que evita condiciones de carrera y garantiza la consistencia de los datos compartidos.
Existen dos formas de aplicar sincronización en Java: a través de métodos sincronizados y bloques sincronizados. Un bloque sincronizado está compuesto por dos partes: una referencia a un objeto que actúa como lock (frecuentemente el objeto actual, indicado por this
), y el bloque de código que será protegido por ese lock. Un método sincronizado, por otro lado, es similar a un bloque sincronizado que abarca todo el código del método, utilizando como lock el objeto sobre el cual se invoca el método. En el caso de los métodos estáticos, la clase misma se usa como lock, garantizando así la exclusividad en la ejecución del código.
Para utilizar el mecanismo de sincronización en Java, sigue estos pasos:
-
Implementar métodos sincronizados:
- Marca un método con la palabra clave
synchronized
para que su ejecución esté protegida por el lock del objeto. Esto garantiza que solo un hilo a la vez pueda acceder al método, evitando condiciones de carrera.
public synchronized void metodoSincronizado() { // Código protegido por el lock del objeto }
- Marca un método con la palabra clave
-
Utilizar bloques sincronizados:
- Para sincronizar solo una parte del método, usa un bloque sincronizado. Proporciona una referencia a un objeto que servirá como lock y coloca el código a sincronizar dentro de ese bloque.
public void metodoConBloqueSincronizado() { synchronized (this) { // Código protegido por el lock del objeto actual } }
-
Sincronización en métodos estáticos:
- Para métodos estáticos, utiliza la clase como lock. Esto se logra sincronizando en la clase misma.
public static synchronized void metodoEstaticoSincronizado() { // Código protegido por el lock de la clase }