Es posible en Java forzar la ejecución de código en un bloque en modo sincronizado, es decir, como mucho un hilo puede ejecutar algún código dentro de dicho bloque al mismo tiempo.
La expresión entre paréntesis obj tiene que evaluar a una referencia a un objeto o a un arreglo.
Declarando un método con el modificador synchronized garantiza que dicho método se ejecuta ininterrumpidamente por un sólo hilo. La máquina virtual instala un cerrojo (mejor decir, un monitor) que se cierra de forma atómica antes de entrar en la región crítica y que se abre antes de salir.
Declarar un método como
es equivalente a usar un bloque sincronizado en su interior:
Los monitor permite que el mismo hilo puede acceder otros métodos o bloques sincronizados del mismo objeto sin problema. Se libera el objeto sea cual sea el modo de terminar el método.
Constructores no se pueden declarar synchronized.
No hace falta de mantener el modo sincronizado sobre-escribiendo métodos síncronos mientras se extiende una clase. Sin embargo, una llamada al método de la clase súperior (con super.) sigue funcionando de modo síncrono.
Métodos estáticos también pueden ser declarados synchronized garantizando su ejecución mutuo exclusivo entre varios hilos.
En ciertos casos se tiene que proteger el acceso a miembros estáticos con un cerrojo. Para conseguir eso es posible de sincronizar con un cerrojo de la clase, por ejemplo:
class MyClass {
static private int nextID;
...
MyClass() {
synchronized(MyClass.class) {
idNum=nextID++;
}
}
...
}
Nota: declarar un bloque o un método como síncrono solo prevee que ningún otro hilo pueda ejecutar al mismo tiempo dicha región crítica, sin embargo, cualquier otro código asíncrono puede ser ejecutado mientras tanto y su acceso a variables críticas puede dar como resultado fallos en el programa.