Semsforo Java

3
Semsforo java La programación concurrente es capaz de realizar varias tareas de forma simultánea. Hay varios tipos de concurrencia, nosotros trabajaremos con programación de memoria común, donde tan sólo tendremos una memoria RAM que es compartida por los demás programas y tareas. Hay un aspecto muy importante para lograr que la concurrencia sea correcta: El resultado debe ser el mismo si se hace con un procesador que con cuatro procesadores. Es decir, el resultado no debe depender del número de núcleos/procesadores del ordenador. Nota: Hablaremos de proceso = hilo. Los sistemas operativos actuales permiten la concurrencia de procesos, el propio sistema operativo se encarga de permitir el uso de variables compartidas para pasar datos de un proceso a otro y controlar las regiones críticas. ¿Qué es una región crítica? Es un trozo de código, en el que la correción del programa se ve comprometido por el uso de variables compartidas. Un proceso sólo podrá acceder a esta región crítica durante un tiempo determinado para que no halla inanición. Java permite de forma intrínseca la concurrencia. Para garantizar la corrección del programa, en Java tenemos varios métodos que podemos utilizar: Monitores: Un monitor implementa una región crítica condicional, de tal forma que podemos sacar de la cola de espera a uno o a todos los procesos esperando. Para que sea un monitor, todos los métodos de la clase deben ser synchronized. Para el uso de monitores, nos ayudamos de los métodos: wait(): Si no se cumple la condición, esperamos. notify(): Cuando hemos entrado en la región crítica, y hemos hecho cierta acción, notificamos a un proceso que hay esperando para entrar si se cumple la condición (le despertamos del wait()).

description

a

Transcript of Semsforo Java

Semsforo javaLa programacin concurrente es capaz de realizar varias tareas de forma simultnea.Hay varios tipos de concurrencia, nosotros trabajaremos con programacin de memoria comn, donde tan slo tendremos una memoria RAM que es compartida por los dems programas y tareas.Hay un aspecto muy importante para lograr que la concurrencia sea correcta:El resultado debe ser el mismo si se hace con un procesador que con cuatro procesadores. Es decir, el resultado no debe depender del nmero de ncleos/procesadores del ordenador.Nota: Hablaremos de proceso = hilo.Los sistemas operativos actuales permiten la concurrencia de procesos, el propio sistema operativo se encarga de permitir el uso de variables compartidas para pasar datos de un proceso a otro y controlar las regiones crticas.Qu es una regin crtica?Es un trozo de cdigo, en el que la correcin del programa se ve comprometido por el uso de variables compartidas. Un proceso slo podr acceder a esta regin crtica durante un tiempo determinado para que no halla inanicin. Java permite de forma intrnseca la concurrencia.Para garantizar la correccin del programa, en Java tenemos varios mtodos que podemos utilizar:Monitores: Un monitor implementa una regin crtica condicional, de tal forma que podemos sacar de la cola de espera a uno o a todos los procesos esperando. Para que sea un monitor, todos los mtodos de la clase deben ser synchronized.Para el uso de monitores, nos ayudamos de los mtodos:wait(): Si no se cumple la condicin, esperamos. notify(): Cuando hemos entrado en la regin crtica, y hemos hecho cierta accin, notificamos a un proceso que hay esperando para entrar si se cumple la condicin (le despertamos del wait()). notifyAll(): Igual que el anterior pero notificamos a todos los hilos que hay esperando.Semforos: El nombre de semforos es como en la vida real, un semforo cerrado no podrn pasar coches hacia un lado, y un semforo abierto s podrn. Los semforos garantizan la exclusin mutua y la sincronizacin (para que los coches no se choquen en la regin crtica que en este caso es el cruce). En semforos nos ayudamos de varios mtodos como por ejemplo:acquire(): Para adquirir el semforo (ponerlo en verde para la cola de coches A) una vez que lo hemos adquirido pueden pasar los coches porque est en verde.release(): El ltimo coche en pasar hace un realease() para que los coches que estn esperando del otro semforo puedan pasar ya que nosotros hemos terminado.Los semforos se usan para controlar el nmero de hilos que pueden acceder a un recurso. Un proceso bloqueado en el semforo, puede ser liberado por otro, esto no ocurre en los locks que veremos a continuacin.Locks: Los locks proporciona mayor rendimiento, con la misma semntica que la sincronizacin. Soporta timeout al adquirir un bloqueo e incluso soporte para interrumpir un hilo. Podemos decir que con los locks controlamos ms lo que hace nuestro programa, es ms manual, y por tanto, se necesita la experiencia del programador para que no tengamos fallo en el programa.Todo esto es bsicamente lo que veremos en concurrencia de memoria comn, ampliaremos algo de teora, pero sobre todo pondremos ejemplos para que veis como funciona.A continuacin os vamos a poner un ejemplo muy completo sobre semforos.Un semforo sirve para controlar el nmero de hilos que acceden a la variable compartida, en este caso el libro. Si inicializamos el semforo a 1 se comportar como un semforo binario, aunque tambin lo podemos inicializar por ejemplo a 15, para gestionar adecuadamente los permisos que le queramos otorgar.Un semforo puede ser liberado por otro proceso, en los locks deben ser liberados por el mismo proceso.El problema a resolver es exactamente el mismo que en el volumen anterior:Todo sobre monitores en Java. Es el mismo enunciado pero esta vez lo resolveremos utilizando semforos, ya veris que es todo muy similar, los comentarios sobre el cdigo estn en el propio cdigo.