programación concurrente — sincronización condicionaldit upm algunos derechos reservados. este...

22
dit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual 3.0 Unported. hBp://crea9vecommons.org/licenses/by-nc-sa/3.0/deed.es Programación concurrente — Sincronización condicional Juan Antonio de la Puente <[email protected]> 20151028

Upload: others

Post on 06-Aug-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

ditUPM

Algunosderechosreservados.EstedocumentosedistribuyebajolicenciaCrea9veCommonsReconocimiento-NoComercial-Compar9rIgual3.0Unported.hBp://crea9vecommons.org/licenses/by-nc-sa/3.0/deed.es

Programaciónconcurrente— SincronizacióncondicionalJuanAntoniodelaPuente <[email protected]>

20151028

Page 2: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Programaciónconcurrente—Sincronizacióncondicional ©2014JuanA.delaPuente

Referencias

•ScoBOaks&HenryWongJavaThreads O'ReillyMedia;3rded(2004)

•KathySierra&BertBates HeadFirstJava,ch.15O'ReillyMedia;2nded(2005)

2

Page 3: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Sincronizacióncondicional

Page 4: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Programaciónconcurrente—Sincronizacióncondicional ©2014JuanA.delaPuente

Sincronizacióncondicional

• Avecesunahebra9enequeesperarhastaquesecumplaunadeterminadacondición‣ suspendesuejecuciónhastaqueestoocurra

• Otrahebrahacequesecumplalacondición‣ avisaalqueestabaesperando‣ éstepuedereanudarsuejecución

• Este9podesincronizaciónsellamasincronizacióncondicional‣ sincronización:elavancedeunahebradependedeloquehagaotrahebra

4

Page 5: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Programaciónconcurrente—Sincronizacióncondicional ©2014JuanA.delaPuente

Ejemplo:ges9óndeunestacionamiento

• LashebrasdelasclaseSensoravisancuandoentraosaleuncoche

5

«monitor»Parking

- n : natural+ entra+ sale+ ocupado: natural

«thread»Sensor

- acceso, id

«thread»Supervisor

Page 6: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Programaciónconcurrente—Exclusiónmutua ©2014JuanA.delaPuente

Sincronización

• Nodebenentrarcochessielestacionamientoestálleno‣ nosepuedeentrarsin>=capacidad‣ siunsensorllamaaentracuandon>=capacidad,debesuspendersuejecuciónhastaquehayasi9o- estáimplícitoqueenesecasonoseabrelabarrerahastaquesepuedacon9nuar

6

Page 7: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Programaciónconcurrente—Sincronizacióncondicional ©2014JuanA.delaPuente

Ejemplo:productoryconsumidor

• Unahebraproduceelementosdeuncierto9po• Otralosconsume• Cadaunaavanzaconunritmodiferente• Seusaunalmacenamientointermedio(buffer)‣ elproductorlosvaponiendoenelbuffersegúnlosproduce‣ elconsumidorlossacadelbuffercuandolosnecesita

7

«thread»Productor

«thread»Consumidor

«monitor»Buffer

+ envia + recibe

Page 8: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Programaciónconcurrente—Sincronizacióncondicional ©2014JuanA.delaPuente

Sincronización

• Nosepuedenextraerdatossielbufferestávacío‣ sicuandoelconsumidorinvocarecibenohaydatosenelbuffer, debesuspendersuejecuciónhastaqueloshaya‣ eselproductorelquelospone

• Nosepuedenañadirdatossielbufferestálleno‣ sicuandoelproductorinvocaenvíaelbufferestálleno,debesuspendersuejecuciónhastaquehayasi9o‣ eselconsumidorelquehacesi9oalextraerdatos

8

Page 9: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Esperaryavisar

Page 10: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Programaciónconcurrente—Sincronizacióncondicional ©2014JuanA.delaPuente

Esperacondicional

• Elmétodowait()suspendelaejecucióndelahebraqueloinvoca

• Seusaparaesperarunacondiciónwhile (!condición) wait();

‣ ¡siempreenunbucle!

• Sólosepuedeinvocardentrodeunmétodosincronizado‣ odeunbloquesincronizado

• Seliberaelcerrojodelobjetoatómicamente‣ almismo9empoquesehacewait()

• PuedelanzarunaexcepciónInterruptedExcep;on‣ usarmanejadoropropagar

10

Page 11: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Programaciónconcurrente—Sincronizacióncondicional ©2014JuanA.delaPuente

Avisodecondición

• Elmétodo notify()reanudalaejecucióndeunahebraqueestésuspendidaporhaberhechowait()

• Seusaparaavisardequesecumpleunacondición// cambiar el estado de alguna condición notify();

• Unahebraavisaaotra• Sólosepuedeinvocardentrodeunmétodosincronizado‣ odeunbloquesincronizado

• Noseliberaelcerrojodelobjetohastaqueterminaelmétodoosentenciasincronizada‣ lahebraquesereanudaintentaadquirirelcerrojoparacon9nuar‣ puedetenerquecompe9rconotrashebras

11

Page 12: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Programaciónconcurrente—Sincronizacióncondicional ©2014JuanA.delaPuente

Avisogeneral

• Elmétodo notifyAll()reanudalaejecucióndetodaslashebrasqueestésuspendidasporhaberhechowait()enelmismoobjeto

• Elcerrojodelobjetoseliberacuandoterminaelmétodoosentenciasincronizada‣ todaslashebrasquesereanudancompitenparaadquirirelcerrojoypodercon9nuar

• Connotify()nosesabequéhebrasereanudaentrelasqueestabansuspendidas

• ConnotifyAll()sereanudantodasycompruebanotravezlacondición

12

Page 13: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

©2014JuanA.delaPuenteProgramaciónconcurrente—Sincronizacióncondicional

Colasdeesperaydeentrada

13

cerrojo

coladeentrada coladeespera

adquirirelcerrojo wait

Page 14: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Programaciónconcurrente—Sincronizacióncondicional ©2014JuanA.delaPuente

no9fyvsno9fyAll

• Siemprequevariashebraspuedanestaresperandocondicionesdis9ntashayqueusarnotifyAll

• Sóloconvienehacernotifysi‣ todaslashebrasesperanlamismacondición‣ sólounahebrapuedeavanzarcuandosecumplelacondición

• Encasodeduda,usarnotifyAll

14

Page 15: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Ejemplo:estacionamiento

Page 16: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

©2014JuanA.delaPuenteProgramaciónconcurrente—Sincronizacióncondicional

Monitorconcondicionespublic class Parking { private final int capacidad; // número de coches que caben private int n = 0; // número de coches que hay

// constructor public Parking (int capacidad) { this.capacidad = capacidad; } // entra un coche por una de las puertas public synchronized void entra (String puerta) { while (n >= capacidad) wait(); n++; } // sale un coche por una de las puertas public synchronized void sale (String puerta) { n—; notifyAll(); } // consulta public synchronized int ocupado() { return n; } }

16

Page 17: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Productoryconsumidor

Page 18: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

©2014JuanA.delaPuenteProgramaciónconcurrente—Sincronizacióncondicional

Ejemplo:bufferpublic class Buffer<E> {

private E almacen; private boolean lleno = false;

public synchronized void enviar(E dato) throws InterruptedException { while (lleno) wait(); // espera que haya sitio almacen = dato; lleno = true; notifyAll(); // avisa de que hay un valor }

public synchronized E recibir() throws InterruptedException { E dato = null; while (!lleno) wait(); // espera que haya un valor dato = almacen; lleno = false; notifyAll(); // avisa de que hay sitio return dato; } }

18

Page 19: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

©2014JuanA.delaPuenteProgramaciónconcurrente—Sincronizacióncondicional

Ejemplo:productor

public class Productor<E> implements Runnable {

private Buffer<E> b;

public Productor(Buffer<E> b) {

this.b = b;

}

public void run() {

while (true) {

E x = …; // producir x

b.enviar(x);

}

}

}

// la sincronización está oculta en el buffer

19

Page 20: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

©2014JuanA.delaPuenteProgramaciónconcurrente—Sincronizacióncondicional

Ejemplo:consumidor

public class Consumidor<E> implements Runnable {

private Buffer<E> b;

public Consumidor(Buffer<E> b) {

this.b = b;

}

public void run() {

while (true) {

E x = b.recibir();

… // consumir x

}

}

}

// la sincronización está oculta en el buffer

20

Page 21: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Resumen

Page 22: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual

Programaciónconcurrente—Sincronizacióncondicional ©2014JuanA.delaPuente

Resumen

• LasincronizacióncondicionalserealizaenJavaconlosmétodoswait()yno9fy()/no9fyAll()‣ sólosepuedenusarenmétodos/bloquessincronizados‣wait()suspendelahebradesdedondeseinvoca‣ no9fy()reanudaunahebrasuspendida‣ no9fyAll()reanudatodaslashebrassuspendidas

• Hayquehacerwait()siempreenunbuclewhile‣ paracomprobarotravezlacondicióndeesperacuandodespierta while (!condición) wait();

22