programación concurrente — sincronización condicionaldit upm algunos derechos reservados. este...
TRANSCRIPT
![Page 1: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/1.jpg)
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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/2.jpg)
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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/3.jpg)
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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/4.jpg)
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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/5.jpg)
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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/6.jpg)
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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/7.jpg)
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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/8.jpg)
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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/9.jpg)
Esperaryavisar
![Page 10: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/10.jpg)
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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/11.jpg)
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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/12.jpg)
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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/13.jpg)
©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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/14.jpg)
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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/15.jpg)
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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/16.jpg)
©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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/17.jpg)
Productoryconsumidor
![Page 18: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/18.jpg)
©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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/19.jpg)
©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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/20.jpg)
©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](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/21.jpg)
Resumen
![Page 22: Programación concurrente — Sincronización condicionaldit UPM Algunos derechos reservados. Este documento se distribuye bajo licencia Crea9ve Commons Reconocimiento-NoComercial-Compar9rIgual](https://reader036.vdocumento.com/reader036/viewer/2022071604/613fb400b44ffa75b804657e/html5/thumbnails/22.jpg)
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