Está en la página 1de 2

Semsforo java

La 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.

También podría gustarte