You are on page 1of 3

V.

Desarrollo de aplicaciones con manejo de


proceso simultneo y uso de mens

Prioridades
Un punto importante a conocer acerca de los hilos es el manejo de prioridades y cmo la
mquina virtual selecciona a un determinado hilo para su ejecucin.
Los hilos tienen prioridades, esta prioridad es relativa a otros hilos en Java. Cuando se dice
que la prioridad es relativa se quiere decir que no se sabe exactamente el mapeo a las
prioridades nativas de un determinado sistema operativo, lo nico con lo que se cuenta es
que las prioridades entre los hilos es relativa a otros hilos dentro de Java.
La mquina virtual simplemente selecciona al hilo de mayor prioridad que est en estado
ejecutable y lo pone en ejecucin, si es que existen dos o ms hilos de igual prioridad, se
selecciona uno en forma aleatoria, el hilo permanece en ejecucin hasta que llama al mtodo
yield o pasa a estado no ejecutable o a estado detenido por algunas de las causas vistas
anteriormente.
Otra cosa importante es que un hilo hereda automticamente su prioridad del hilo que lo
crea, en el ejemplo anterior los tres hilos tienen la misma prioridad y esta es igual a la
prioridad del applet.
Se puede modificar la prioridad de un hilo con una llamada al mtodo setPriority que recibe
como parmetro un entero, en estos momentos Java tiene definido 10 prioridades de 1 a 10,
no es conveniente utilizarlas as en forma absoluta porque no se sabe que es lo que va a
pasar posteriormente con esto de las prioridades, por lo pronto se pueden utilizar tres
constantes que son, prioridad mnima, prioridad normal y prioridad mxima.
Normalmente lo que se hace cuando se tiene una animacin por ejemplo, es establecer la
prioridad de esa animacin a la prioridad mnima utilizando el mtodo setPriority y
mandndole como parmetro la constante MIN_PRIORITY de la clase Thread.
Si un hilo de alta prioridad se pone en ejecucin y no tiene absolutamente ninguna operacin
de entrada-salida este hilo puede acaparar todo el CPU si es que no llama en algn momento
al mtodo yield o al mtodo sleep, esto se conocen como hilos egostas, as que es
conveniente que cuando los hilos no tengan operaciones de entrada-salida ejecuten
peridicamente yield o sleep para que no haya ningn acaparamiento del CPU por parte de
un hilo egosta.
Es conveniente saber que yield slo cede el CPU a hilos de igual prioridad, sino existen hilos
de igual prioridad al que se est ejecutando la llamada de yield es como si no existiera.
Resumiendo lo anterior se puede decir que:

Todos los hilos tienen una prioridad relativa a otros hilos.


La mquina virtual selecciona al hilo de mayor prioridad en estado ejecutable y lo

pone a correr.
El hilo que est en ejecucin hasta que: llama a yield() o hasta que pasa a estado no
ejecutable (parado).
Un hilo hereda su prioridad del hilo que lo crea.
La prioridad de un hilo se puede modificar con setPriority(int). Utilizando las
constantes disponibles MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY
Si un hilo de alta prioridad se pone en ejecucin y no tiene nada de I/O puede
acaparar todo el CPU (hilos egoistas, selfish threads)
Es conveniente que el hilo ejecute yield() o sleep() a intervalos regulares para dar la
oportunidad de que otros hilos puedan correr.
yield() slo cede el CPU a hilos de igual prioridad.

Sincronizacin de Hilos
Es comn que varios procesos en ejecucin manipulen a un recurso compartido. Si los
hilos que acceden recursos compartidos simplemente lo leen, entonces no hay necesidad
de evitar que este sea utilizado por ms de un hilo a la vez. Sin embargo, cuando varios
hilos comparten un objeto y este puede ser modificado por uno o ms de los hilos pueden
ocurrir resultados indeterminados; en algunas ocasiones producir resultados correctos
mientras que en otras los resultados sern incorrectos.
Para evitar esto, el recurso compartido se debe administrar de manera adecuada dndole
a cada subproceso acceso exclusivo al cdigo que manipule al objeto compartido. Cuando
un hilo se encuentre accediendo al recurso los dems hilos que tambin desean acceder
el recurso se deben mantener en espera. Cuando el hilo que est accediendo al recurso
compartido termina, a uno de los procesos que estn en espera se le permite continuar. A
este proceso se le conoce como sincronizacin de hilos.
Qu pasa cuando diferentes hilos hacen acceso a recursos del programa, en este caso es
necesario sincronizar este acceso para evitar inconsistencias en resultados, si dos hilos
acceden al mismo recurso, el orden de ejecucin es impredecible, depende de la mquina
virtual adems de otros factores como la carga del sistema en este momento y la ejecucin
de otros hilos. Java implementa un mecanismo de monitores, este concepto es el que se ve
en algn curso de sistemas operativos; si un objeto se le asocia la palabra reservada
sincronize automticamente a este objeto se le asocia un candado o un lock.
Un monitor permite el acceso serializado y no simultneo a un objeto, es decir controla que
solamente un hilo est accediendo a un determinado recurso al mismo tiempo para evitar
caer en inconsistencias.
En otras palabras:

Es necesario sincronizar el acceso a recursos compartidos para evitar inconsistencias


en los resultados.
Si dos hilos acceden a un mismo recurso, el orden de ejecucin es impredecible,
depende de la mquina virtual y otros factores del sistema (carga, ejecucin de otros
hilos, etc.)
Java implementa un mecanismo de monitores, si un objeto es identificado con
synchronized se le asocia un candado (lock).
Un monitor permite el acceso serializado y no simultneo a un objeto.

Usando Synchronized
En el momento en que un objeto quiera acceder a otro objeto que est sincronizado se pone
en una fila de espera hasta que se quite el candado, solamente un hilo puede estar dentro de
un objeto sincronizado.
Cuando se utiliza la sincronizacin en objetos se puede hacer en una instruccin en un
conjunto de instrucciones o en un mtodo, la recomendacin es que siempre se haga a nivel
mtodo.
Algo muy importante es que un objeto tiene solamente un candado si es que en un objeto
que se quiere sincronizar, se sincronizan dos o ms mtodos se puede tener esos mtodos
sincronizados pero solamente existe un candado, qu quiere decir esto?, que si algn otro
objeto, en este caso un hilo llama a un mtodo sincronizado automticamente se pone el
candado al objeto, es decir otro hilo no puede acceder a ese objeto por la llamada a otro
mtodo aunque sea diferente al que est sincronizado.
La manera de liberar el candado en un objeto es simplemente terminar la ejecucin del
mtodo sincronizado, el hecho de que se utilice sincronizacin tiene un impacto importante
en el rendimiento del programa, as es que la sincronizacin se debe mantener un mnimo y
solamente utilizarla cuando se necesite. Por ejemplo, hay ciertas asignaciones de datos
primitivos que no vale la pena sincronizar por que se que son atmicas, es decir se realizan
en una sola instruccin del CPU.
Concluyendo:

Hilos que quieran acceder a un objeto sincronizado se ponen en fila de espera hasta
que el objeto quede desocupado (unlock)
Slo un hilo puede estar dentro de un objeto sincronizado.
Se recomienda utilizar synchronized a nivel mtodo, pero puede sincronizar cualquier
seccin de cdigo (seccin crtica).
Cada objeto tiene un slo candado, si un hilo entra a un mtodo sincronizado, el
objeto pone el candado a todos los mtodos sincronizados, es decir ningn otro hilo
puede ejecutar ningn mtodo sincronizado del objeto, hasta que el hilo poseedor del
candado lo libere.
La manera de liberar el candado en un objeto es cuando se termina la ejecucin del
un mtodo sincronizado.
No vale la pena sincronizar asignaciones de algunos datos primitivos porque son
atmicas.
Excesiva sincronizacin tiene un impacto relevante en el rendimiento

You might also like