Antes de leer esta sección, deberías estar familiarizado con los conceptos de threads de control y programas multi-threads. Threads de Control cubre la programación de threads. En particular, la página Programas Multi-Thread cubre elementos relacionados con la escritura de programas que contienen varios threads, incluyendo cómo sincronizarlos.
No se deben pasar referencias locales de un thread a otro. En particular, una referencia local se podría volver no válida antes de que otro thread tenga la posibilidad de utilizarla. Se deben convertir siempre en referencias globales cuando haya alguna duda sobre que una referencia a un objeto pueda ser uitlizada por threads diferentes.
Chequea el uso de variables globales cuidadosamente. Varios threads podrían acceder a las variables globales al mismo tiempo. Asegurate de que pones los bloqueos nocesarios para asegurar la seguridad.
synchronized (obj) {
... /* synchronized block */
}
La Máquina Virtual Java garantiza que un thread deba adquirir el monitor asociado con el objeto Java obj antes de poder ejecutar las sentencias del bloque. Por lo tanto, en un momento dado, sólo puede haber un thread ejecutándose dentro del bloque sincronizado.
El código nativo puede realizar una sincronización equivalente de objetos utilizando las funciones del JNI
MonitorEnter y MonitorExit. Por ejemplo:
(*env)->MonitorEnter(obj);
... /* synchronized block */
(*env)->MonitorExit(obj);
Un thread debe introducir el monitor asociado con obj antes de poder continuar con la ejecución. El monitor contiene un contador que señala cuantas veces ha sido introducido por un thread dado. MonitorEnter incrementa el contador cuando el thread entra un monitor que ya ha sido introducido. MonitorExit decrementa el contador. Si el contador alcanza el valor 0, otros threads pueden introducir el monitor.