PDF de programación - PROGRAMACION CONCURRENTE Y DISTRIBUIDA - III.3 Concurrencia con Java: Sincronización

Imágen de pdf PROGRAMACION CONCURRENTE Y DISTRIBUIDA - III.3 Concurrencia con Java: Sincronización

PROGRAMACION CONCURRENTE Y DISTRIBUIDA - III.3 Concurrencia con Java: Sincronizacióngráfica de visualizaciones

Publicado el 14 de Enero del 2017
511 visualizaciones desde el 14 de Enero del 2017
1,3 MB
24 paginas
Creado hace 14a (13/10/2009)
PROGRAMACION CONCURRENTE Y

DISTRIBUIDA

III.3 Concurrencia con Java: Sincronización

J.M. Drake
L.Barros

Notas:

1

Recursos de Java para sincronizar threads

Todos los objetos tienen un bloqueo asociado, lock o cerrojo, que puede
ser adquirido y liberado mediante el uso de métodos y sentencias
synchronized.
La sincronización fuerza a que la ejecución de los dos hilos sea
mutuamente exclusiva en el tiempo.
Mecanismos de bloqueo:

Métodos synchronized (exclusión mutua).
Bloques synchronized (regiones críticas).

Mecanismos de comunicación de los threads (variables de condición):
Wait(), notify(),notifyAll()...
Cualquier otro mecanismo:
Dado que con monitores se pueden implementar los restantes mecanismos de
sincronización
Invocación de
procedimientos remotos, etc.) se pueden encapsular estos elementos en clases
y basar la concurrencia en ellos.

(Semáforos, Comunicación

síncrona,

Notas:

Procodis’09: III.3- Sincronización de thread Java José M.Drake

2

2

Lock asociado a los componentes Java.

Cada objeto derivado de la clase object ( esto es, prácticamente
todos) tienen asociado un elemento de sincronización o lock
intrínseco, que afecta a la ejecución de los métodos definidos como
synchronized en el objeto:
Cuando un objeto ejecuta un método synchronized, toma el lock, y

cuando termina de ejecutarlo lo libera.

Cuando un thread tiene tomado el lock, ningún otro thread puede

ejecutar ningún otro método synchronized del mismo objeto.

El thread que ejecuta un método synchronized de un objeto cuyo lock
se encuentra tomado, se suspende hasta que el objeto es liberado y se
le concede el acceso.

Cada clase Java derivada de Object, tiene también un mecanismo
lock asociado a ella (que es independiente del asociado a los objetos
de esa clase) y que afecta a los procedimientos estáticos declarados
synchronized.

Notas:

Procodis’09: III.3- Sincronización de thread Java José M.Drake

3

3

Bloques synchronized.

Es el mecanismo mediante el que se implementan en Java las
regiones críticas.
Un bloque de código puede ser definido como synchronized
respecto de un objeto. En ese caso solo se ejecuta si se obtiene
el lock asociado al objeto

synchronized (object){
Bloque de estamentos

}

Se suele utilizar cuando se necesita utilizar en un entorno
concurrente, un objeto diseñado para un entorno secuencial.

Notas:

Procodis’09: III.3- Sincronización de thread Java José M.Drake

4

Este mecanismo presenta el inconveniente de las Regiones críticas, y es que los diferentes
bloques que interaccionan a través de una región crítica resultan dispersos por múltiples módulos
de la aplicación, y ello hace que su mantenimiento sea muy complejo y delicado.

Observese que en Java no hay Regiones Críticas Condicionales, por lo que no se pueden resolver
con este mecanismo todos los problemas.

4

Ejemplo de utilización de bloque synchronized

// Hace que todos los elementos del array sean no negativos

public static void abs(int[] valores){

synchronized (valores){

// Sección crítica
for (int i=0; i<valores.length; i++){

if (valores[i]<0) valores[i]= -valores[i];

}

}

}

Notas:

Procodis’09: III.3- Sincronización de thread Java José M.Drake

5

5

Implementación de Monitores: Métodos synchronized

Los métodos de una clase Java se pueden declarar como
synchronized. Esto significa que se garantiza que se ejecutará
con régimen de exclusión mutua respecto de otro método del
mismo objeto que también sea synchronized.
Cuando un thread invoca un método synchronized, trata de
tomar el lock del objeto a que pertenezca. Si está libre, lo
toma y se ejecuta. Si el lock está tomado por otro thread, se
suspende el que invoca hasta que aquel finalice y libere el
lock.
Si el método synchronized es estático (static), el lock al que
hace referencia es de clase y no de objeto, por lo que se hace
en exclusión mútua con cualquier otro método estático
synchronized de la misma clase.

Notas:

Procodis’09: III.3- Sincronización de thread Java José M.Drake

6

6

Ejemplo de método synchronized.

class CuentaBancaria{

private class Deposito{

protected double cantidad;
protected String moneda =“Euro”

}
Deposito elDeposito;
public CuentaBancaria(double initialDeposito,String moneda){

elDeposito.cantidad= initialDeposito;
elDeposito.moneda=moneda; }

public sychronized double saldo(){return elDeposito.cantidad;}
public synchronized void ingresa(double cantidad){

elDeposito.cantidad=elDeposito.cantidad + cantidad;

}

}

Notas:

Procodis’09: III.3- Sincronización de thread Java José M.Drake

7

7

Exclusión mutua

Thread 2->lock tomado->Espera

public sychronized double saldo(){

return elDeposito.cantidad;

}

Thread 1->Toma el lock->Ejecuta

public synchronized void ingresa(double cantidad){

elDeposito.cantidad=elDeposito.cantidad + cantidad;

}

Procodis’09: III.3- Sincronización de thread Java José M.Drake

8

Notas:

8

Consideraciones sobre métodos synchronized.

(static)

El lock es tomado por el thread, por lo que mientras un thread
tiene tomado el lock de un objeto puede acceder a otro
método synchronized del mismo objeto.
El lock es por cada instancia del objeto.
Los métodos de clase
también pueden ser
synchronized. Por cada clase hay un lock y es relativo a todos
los métodos synchronized de la clase. Este lock no afecta a los
accesos a los métodos synchronized de los objetos que son
instancia de la clase.
Cuando una clase se extiende y un método se sobreescribe,
este se puede definir como synchronized o nó, con
independencia de cómo era y como sigue siendo el método de
la clase madre.

Notas:

Procodis’09: III.3- Sincronización de thread Java José M.Drake

9

9

Métodos de Object para sincronización.

Todos son métodos de la clase object. Solo se pueden invocar por el
thread propietario del lock (p.e. dentro de métodos synchronized). En
caso contrario lanzan la excepción IllegalMonitorStateException
public final void wait() throws InteruptedException
Espera indefinida hasta que reciba una notificación.

public final void wait(long timeout) throws InteruptedException

El thread que ejecuta el método se suspende hasta que, o bien recibe una
notificación, o bien,transcurre el timeout establecido en el argumento. wait(0)
representa una espera indefinida hasta que llegue la notificación.

public final wait(long timeout, int nanos)

Wait en el que el tiempo de timeout es 1000000*timeout+ nanos nanosegundos

public final void notify()

Notifica al objeto un cambio de estado, esta notificación es transferida a solo uno
de los threads que esperan (han ejecutado un wait) sobre el objeto. No se puede
especificar a cual de los objetos que esperan en el objeto será despertado.

public final void notifyAll()

Notifica a todos los threads que esperan (han ejecutado un wait) sobre el objeto.

Notas:

Procodis’09: III.3- Sincronización de thread Java José M.Drake

10

10

Protocolo Wait/Notify

Procodis’09: III.3- Sincronización de thread Java José M.Drake

11

Notas:

It's not enough just to say, "Don't run while I am running." We need the threads to be able to say,
"OK, I have some data ready for you," and to suspend themselves if there isn't data ready.

11

Uso de los métodos wait().

Debe utilizarse siempre dentro de un método synchronized y
habitualmente dentro de un ciclo indefinido que verifica la
condición:

synchronized void HazSiCondicion(){

while (!Condicion) wait();
....... // Hace lo que haya que hacer si la condición es cierta.

}

Cuando se suspende el thread en el wait, libera el lock que poseía sobre el

objeto. La suspensión del thread y la liberación del lock son atómicos (nada
puede ocurrir entre ellos).

Cuando el thread es despertado como consecuencia de una notificación, la

activación del thread y la toma del lock del objeto son también atómicos
(Nada puede ocurrir entre ellos).

Notas:

Procodis’09: III.3- Sincronización de thread Java José M.Drake

12

12

Uso de los métodos notify().

Debe utilizarse siempre dentro de un método synchronized:

synchronized void changeCondition(){

..... // Se cambia algo que puede hacer que la condición se satisfaga.
notifyAll();

}

Muchos thread pueden estar esperando sobre el objeto:
Si se utiliza notify() solo un thread (no se sabe cual) es despertado.
Si se utiliza notifyAll() todos los thread son despertados y cada uno
decide si la notificación le afecta, o si no, vuelve a ejecutar el wait()
(dentro del while).

El proceso suspendido debe esperar hasta que el procedimiento que invoca
notify() o notifyAll ha liberado el lock del objeto.

Notas:

Procodis’09: III.3- Sincronización de thread Java José M.Drake

13

13

Ejemplo de sincronización: Establecimiento de una variable.

Thread 1

Thread 2

public synchronized guardedJoy() {

//This guard only loops once for each
//special event, which may not
//be the event we're waiting for.

public synchronized notifyJoy() {

joy = true; notifyAll();

}

while(!joy) {

try {

wait();

} catch (InterruptedException e) {}

}
System.out.println("Joy and
efficiency have been achieved!");

}

Notas:

Procodis’09: III.3- Sincronización de thread Java José M.Drake

14

14

Ejemplo Monitor: Buffer de capacidad finita

public synchronized void put(Object obj)

throws InterruptedException{

public interface Buffer {

public void put(Object obj)

throws InterruptedException;

public Object get()

throws InterruptedException;

}

class FixedBuffer implements Buffer{

Object[] buf;
int in = 0;
int out = 0;
int count= 0;
int size;
public FixedBuffer(int size){

this.size= size;
buf = new O
  • Links de descarga
http://lwp-l.com/pdf1023

Comentarios de: PROGRAMACION CONCURRENTE Y DISTRIBUIDA - III.3 Concurrencia con Java: Sincronización (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad