5_Desa_apli_manejo_procesos-Capitulo 3 -01 Prioridades y Sincronizacion

Embed Size (px)

DESCRIPTION

hilos en java

Citation preview

  • 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

    V. Desarrollo de aplicaciones con manejo de

    proceso simultneo y uso de mens

  • 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