Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
ditUPM
Algunosderechosreservados.EstedocumentosedistribuyebajolicenciaCrea9veCommonsReconocimiento-NoComercial-Compar9rIgual3.0Unported.hBp://crea9vecommons.org/licenses/by-nc-sa/3.0/deed.es
Programaciónconcurrente— SincronizacióncondicionalJuanAntoniodelaPuente <[email protected]>
20151028
Programaciónconcurrente—Sincronizacióncondicional ©2014JuanA.delaPuente
Referencias
•ScoBOaks&HenryWongJavaThreads O'ReillyMedia;3rded(2004)
•KathySierra&BertBates HeadFirstJava,ch.15O'ReillyMedia;2nded(2005)
2
Sincronizacióncondicional
Programaciónconcurrente—Sincronizacióncondicional ©2014JuanA.delaPuente
Sincronizacióncondicional
• Avecesunahebra9enequeesperarhastaquesecumplaunadeterminadacondición‣ suspendesuejecuciónhastaqueestoocurra
• Otrahebrahacequesecumplalacondición‣ avisaalqueestabaesperando‣ éstepuedereanudarsuejecución
• Este9podesincronizaciónsellamasincronizacióncondicional‣ sincronización:elavancedeunahebradependedeloquehagaotrahebra
4
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
Programaciónconcurrente—Exclusiónmutua ©2014JuanA.delaPuente
Sincronización
• Nodebenentrarcochessielestacionamientoestálleno‣ nosepuedeentrarsin>=capacidad‣ siunsensorllamaaentracuandon>=capacidad,debesuspendersuejecuciónhastaquehayasi9o- estáimplícitoqueenesecasonoseabrelabarrerahastaquesepuedacon9nuar
6
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
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
Esperaryavisar
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
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
Programaciónconcurrente—Sincronizacióncondicional ©2014JuanA.delaPuente
Avisogeneral
• Elmétodo notifyAll()reanudalaejecucióndetodaslashebrasqueestésuspendidasporhaberhechowait()enelmismoobjeto
• Elcerrojodelobjetoseliberacuandoterminaelmétodoosentenciasincronizada‣ todaslashebrasquesereanudancompitenparaadquirirelcerrojoypodercon9nuar
• Connotify()nosesabequéhebrasereanudaentrelasqueestabansuspendidas
• ConnotifyAll()sereanudantodasycompruebanotravezlacondición
12
©2014JuanA.delaPuenteProgramaciónconcurrente—Sincronizacióncondicional
Colasdeesperaydeentrada
13
cerrojo
coladeentrada coladeespera
adquirirelcerrojo wait
Programaciónconcurrente—Sincronizacióncondicional ©2014JuanA.delaPuente
no9fyvsno9fyAll
• Siemprequevariashebraspuedanestaresperandocondicionesdis9ntashayqueusarnotifyAll
• Sóloconvienehacernotifysi‣ todaslashebrasesperanlamismacondición‣ sólounahebrapuedeavanzarcuandosecumplelacondición
• Encasodeduda,usarnotifyAll
14
Ejemplo:estacionamiento
©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
Productoryconsumidor
©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
©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
©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
Resumen
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