SlideShare una empresa de Scribd logo
1 de 41
Multithreading Issues
Hemos discutido las tres formas de crear un hilo y
hasta este punto sólo hemos mostrado como
crear e iniciar un hilo lo cual es la parte fácil.
La parte difícil es garantizar que los hilos se
comporten en la manera que mantengan la
integridad del programa y los datos involucrados.
Los hilos en un programa se encuentran en el
mismo proceso en memoria y por eso tienen
acceso a la misma memoria.
Multithreading Issues
Debido a que no se tiene control sobre
cuando un hilo es planificado, nunca se
sabe cuando un hilo se detendrá y tiene
que regresar a la cola de prioridad.
Un hilo puede encontrarse en el medio de
una tarea de datos sensitivos y el hilo que
actualmente esta corriendo puede
desordenar las cosas mientras que otros
hilos esperan para correr.
Multithreading Issues
No es difícil de presentar un ejemplo para
demostrar como dos hilos pueden hacer
que los datos no sean válidos.
Tomemos la siguiente clase BankAccount
la cual representa una simple cuenta
bancaria con un número, balance y
métodos para hacer depósitos y retiros.
public class BankAccount
{
private double balance;
private int number;
public BankAccount(int number, double initialBalance){
balance = initialBalance;
}
public int getNumber(){
return number;
}
public double getBalance()
{
return balance;
}
public void deposit(double amount)
{
double prevBalance = balance;
balance = prevBalance + amount;
}
public void withdraw(double amount)
{
double prevBalance = balance;
balance = prevBalance - amount;
}
}
Multithreading Issues
La clase BankAccount se ve
suficientemente simple; pero verifique la
siguiente clase BankTeller que hace un
depósito de $100 en el objeto
BankAccount.
public class BankTeller extends Thread
{
private BankAccount account;
public BankTeller(BankAccount a)
{
account = a;
}
public void run()
{
System.out.println(this.getName() + " depositing $100...");
account.deposit(100.00);
}
}
Multithreading Issues
Nuevamente la clase BankTeller se ve
suficientemente simple.
Para hacer una prueba de las clases
BankTeller y BankAccount, se ha escrito
un programa llamado SomethingsWrong
el cual crea un simple objeto BankAccount
y dos hilos BankTeller.
public class SomethingsWrong
{
public static void main(String [] args)
{
BankAccount account = new BankAccount(101, 1000.00);
System.out.println("Initial balance: $" + account.getBalance());
Thread teller1 = new BankTeller(account);
Thread teller2 = new BankTeller(account);
teller1.start();
teller2.start();
Thread.yield();
System.out.println("Withdrawing $200...");
account.withdraw(200);
System.out.println("nFinal balance: $" + account.getBalance());
}
}
Multithreading Issues
Se ha agregado una invocación llamado al
método yield() de tal manera que el hilo
main() le da a los hilos BankTeller una
oportunidad de ejecutarse primero, por
eso se incrementa la probabilidad de que
los dos depósitos ocurren antes del retiro.
Esto no garantiza que los depósitos
ocurrirán primero, y que el balance final
sea $1000.0, con o sin el llamado a yield()
en el main().
Multithreading Issues
La salida del programa
SomethingsWrong se ve consistente con
la lógica del programa:
 El balance inicial es $1000, los dos depósitos
de $100 se realizaron, un retiro de $200
también se realizó, por eso el balance final
debe ser de $1000, lo cual es así.
Multithreading Issues
No se ha nombrado al programa
SomethingsWrong sin razón, he tenido la
pretensión de que este programa trabaja debido
a pura suerte.
Los dos hilos BankTeller tienen una referencia
al mismo objeto BankAccount. En otras
palabras dos hilos comparten la misma memoria.
Los hilos corren lo suficientemente rápido de tal
manera que ellos no se bloquean en medio de
su corrida. Sin embargo, si ellos se hubiesen
bloqueado por alguna razón, un resultado
diferente habría ocurrido.
Multithreading Issues
Para probar esta teoría se ha agregado un
llamado al método sleep() en los métodos
deposit() y withdraw() de BankAccount,
forzando a que los hilos BankTeller sean
bloqueados en el medio de la transacción:
public void deposit(double amount)
{
double prevBalance = balance;
try
{
Thread.sleep(4000);
}catch(InterruptedException e)
{}
balance = prevBalance + amount;
}
public void withdraw(double amount)
{
double prevBalance = balance;
try
{
Thread.sleep(4000);
}catch(InterruptedException e)
{}
balance = prevBalance - amount;
}
Multithreading Issues
Al agregar el llamado a sleep() se fuerza a
los hilos a cambiar la ejecución. Al
ejecutar nuevamente el programa
SomethigsWrong se generan resultados
diferentes, Después de dos depósitos de
$100, seguido del retiro de $200, el
balance debería ser de $1000, pero por
alguna razón es de solo $800.
Multithreading Issues
En el entorno del mundo real en el que se
involucra el dinero, este resultado no es
aceptable, especialmente para el cliente al
cual le aparece que ha perdido $200.
El problema surge por que los tres hilos
( main() y los dos cajeros del banco )
están accediendo los mismos datos en la
memoria al mismo tiempo.
Multithreading Issues
Cuando se trabaja con información de datos
sensitivos tal como el balance de una cuenta de
banco, múltiples hilos accediendo los datos es lo
que ha ocurrido.
Por ejemplo, si el depósito se va a hacer, no se
debe permitir ninguna otra transacción que afecte
el balance hasta que el depósito termine.
Esto se puede hacer sincronizando los hilos.
synchronized Keyword
La clase BankAccount de la sección anterior
claramente no es un hilo seguro. Múltiples hilos
pueden hacer depósitos y retiros que no han
sido implementados satisfactoriamente.
Para hacer que la clase sea de hilos seguros, se
pueden tomar las ventajas de las características
de la sincronización construidas en el lenguaje
Java.
synchronized Keyword
La palabra clave synchronized en Java crea un
bloque de código el cual es referido como
“sección crítica”.
Cualquier objeto con una sección crítica de
código obtiene un cerrojo asociado con el objeto.
Para entrar a la sección crítica, un hilo necesita
obtener el correspondiente objeto cerrojo.
synchronized Keyword
Para corregir el problema con la clase
BankAccount, necesitamos crear una sección
crítica alrededor del código de datos sensitivos
de los métodos deposit() y withdraw().
Cuando usamos la palabra clave synchronized
para crear esta sección critica, Se debe
especificar que cerrojo va a hacer pedido al
pasar en una referencia al objeto que tiene el
cerrojo.
synchronized Keyword
Por ejemplo el siguiente método deposit()
sincroniza al objeto BankAccount:
synchronized Keyword
public void deposit(double amount){
double prevBalance = balance;
synchronized(this){
try
{
Thread.sleep(4000);
}catch(InterruptedException e){}
balance = prevBalance + amount;
}
}
synchronized Keyword
La palabra clave synchronized es
comúnmente usada dentro de una clase
para hacer el hilo sea seguro.
En este caso, la sección critica esta
sincronizada en la referencia this. Una
forma alterna de sincronizar en la
referencia this es declarar el método
entero como syncronized. Por ejemplo:
synchronized Keyword
Por ejemplo:
public synchronized void withdraw( double amount )
{
// Method definition
}
synchronized Keyword
Cuando el método sincronizado
withdraw() es invocado, el hilo actual
intentará obtener el cerrojo en este objeto
y liberar este objeto cuando el método
termine su ejecución.
synchronized Keyword
Sincronizar el método entero es preferido
sobre la sincronización en la referencia
this dentro del método por que esto
permite que la JVM maneje el método
que llama y la sincronización sea más
eficiente. También, esto le permite a los
usuarios de la clase, ver por la firma del
método, que este método esta
sincronizado.
synchronized Keyword
Esto nos dice, que los métodos no se deben
sincronizar arbitrariamente a menos que este
sea necesariamente para un hilo seguro y de tal
forma que no creen innecesariamente secciones
críticas.
Si un método tiene 50 líneas de código, y se
necesita sincronizar sólo tres líneas de estas, no
se debe sincronizar el método entero.
synchronized Keyword
Colgarse de un cerrojo cuando este no es
necesario puede tener repercusiones
considerables sobre el rendimiento,
especialmente si otro hilo esta en espera
del cerrojo.
synchronized Keyword
Se ha creado una nueva clase llamada
ThreadSafeBankAccount que contiene el
método deposit(). En adición, se ha
agregado la palabra clave synchronized
al método withdraw(). También se ha
modificado la clase BankTeller, por la
clase Bankteller2, así este hace su
depósito de $100 en el objeto
ThreadSafeBankAccount.
synchronized Keyword
El programa SomethingFixed es idéntico
al programa SomethigsWrong excepto
que este usa las clases
ThreadSafeBankAccount y BankTeller2.
public class ThreadSafeBankAccount
{
private double balance;
private int number;
public ThreadSafeBankAccount(int number, double initialBalance)
{
this.number = number;
balance = initialBalance;
}
public int getNumber()
{
return number;
}
public double getBalance()
{
return balance;
}
public void deposit(double amount)
{
synchronized(this)
{
double prevBalance = balance;
try
{
Thread.sleep(4000);
}catch(InterruptedException e)
{}
balance = prevBalance + amount;
}
}
public synchronized void withdraw(double amount)
{
double prevBalance = balance;
try
{
Thread.sleep(4000);
}catch(InterruptedException e)
{}
balance = prevBalance - amount;
}
}
public class BankTeller2 extends Thread
{
private ThreadSafeBankAccount account;
public BankTeller2(ThreadSafeBankAccount a)
{
account = a;
}
public void run()
{
System.out.println(this.getName() + " depositing $100...");
account.deposit(100.00);
}
}
public class SomethingsFixed
{
public static void main(String [] args)
{
ThreadSafeBankAccount account = new
ThreadSafeBankAccount(101, 1000.00);
System.out.println("Initial balance: $" + account.getBalance());
Thread teller1 = new BankTeller2(account);
Thread teller2 = new BankTeller2(account);
teller1.start();
teller2.start();
Thread.yield();
System.out.println("Withdrawing $200...");
account.withdraw(200);
System.out.println("nFinal balance: $" + account.getBalance());
}
}
synchronized Keyword
La salida es:
Initial balance: $1000.0
Thread-0 deposit $100…
Thread-1 deposit $100…
withdrawing $200…
Final balance: $1000.0
synchronized Keyword
Dos cosas se notarán al correr el programa
SomethingsFixed:
 Este toma más tiempo de ejecución.
 trabaja correctamente esta vez.
Esto es debido a que el depósito y el retiro no
ocurren al mismo tiempo como estaban en el
programa SomethingWrong, en su lugar ellos
corren secuencialmente ( uno a la vez ).

Más contenido relacionado

La actualidad más candente

Tema 12 hilos en java por gio
Tema 12   hilos en java por gioTema 12   hilos en java por gio
Tema 12 hilos en java por gioRobert Wolf
 
Programando en java
Programando en javaProgramando en java
Programando en javajulianbm60
 
Programacion concurrente
Programacion concurrenteProgramacion concurrente
Programacion concurrenteAnel Sosa
 
Uso de Excepciones en JAVA
Uso de Excepciones en JAVAUso de Excepciones en JAVA
Uso de Excepciones en JAVAinnovalabcun
 
SCJP, Clase 9: Threads
SCJP, Clase 9: ThreadsSCJP, Clase 9: Threads
SCJP, Clase 9: Threadsflekoso
 
Ocp, jse 6 programmer (1 z0 851) - guia practica 4 de 7(concurrencia) v1
Ocp, jse 6 programmer (1 z0 851) - guia practica 4 de 7(concurrencia) v1Ocp, jse 6 programmer (1 z0 851) - guia practica 4 de 7(concurrencia) v1
Ocp, jse 6 programmer (1 z0 851) - guia practica 4 de 7(concurrencia) v1Oscar V
 
SCJP, Clase 10: Strings, I/O
SCJP, Clase 10: Strings, I/OSCJP, Clase 10: Strings, I/O
SCJP, Clase 10: Strings, I/Oflekoso
 
Multitarea e hilos en java
Multitarea e hilos en javaMultitarea e hilos en java
Multitarea e hilos en javaTensor
 
Thread group demonios- parte1
Thread group demonios- parte1Thread group demonios- parte1
Thread group demonios- parte1Abrahan Reyes
 
Programación multitarea
Programación multitareaProgramación multitarea
Programación multitareabowelmx
 

La actualidad más candente (18)

Hilos En Java
Hilos En JavaHilos En Java
Hilos En Java
 
Hilos – threads en java
Hilos – threads   en javaHilos – threads   en java
Hilos – threads en java
 
Tema 12 hilos en java por gio
Tema 12   hilos en java por gioTema 12   hilos en java por gio
Tema 12 hilos en java por gio
 
Threads en Java
Threads en JavaThreads en Java
Threads en Java
 
Multitarea e hilos en java con ejemplos
Multitarea e hilos en java con ejemplosMultitarea e hilos en java con ejemplos
Multitarea e hilos en java con ejemplos
 
Programando en java
Programando en javaProgramando en java
Programando en java
 
Programacion concurrente
Programacion concurrenteProgramacion concurrente
Programacion concurrente
 
Java Threads (Hilos en Java)
Java Threads (Hilos en Java)Java Threads (Hilos en Java)
Java Threads (Hilos en Java)
 
Uso de Excepciones en JAVA
Uso de Excepciones en JAVAUso de Excepciones en JAVA
Uso de Excepciones en JAVA
 
SCJP, Clase 9: Threads
SCJP, Clase 9: ThreadsSCJP, Clase 9: Threads
SCJP, Clase 9: Threads
 
Ocp, jse 6 programmer (1 z0 851) - guia practica 4 de 7(concurrencia) v1
Ocp, jse 6 programmer (1 z0 851) - guia practica 4 de 7(concurrencia) v1Ocp, jse 6 programmer (1 z0 851) - guia practica 4 de 7(concurrencia) v1
Ocp, jse 6 programmer (1 z0 851) - guia practica 4 de 7(concurrencia) v1
 
SCJP, Clase 10: Strings, I/O
SCJP, Clase 10: Strings, I/OSCJP, Clase 10: Strings, I/O
SCJP, Clase 10: Strings, I/O
 
PCJ Sesión 9: Threads
PCJ Sesión 9: ThreadsPCJ Sesión 9: Threads
PCJ Sesión 9: Threads
 
Uso de hilos
Uso de hilosUso de hilos
Uso de hilos
 
Multitarea e hilos en java
Multitarea e hilos en javaMultitarea e hilos en java
Multitarea e hilos en java
 
Thread group demonios- parte1
Thread group demonios- parte1Thread group demonios- parte1
Thread group demonios- parte1
 
Threads
ThreadsThreads
Threads
 
Programación multitarea
Programación multitareaProgramación multitarea
Programación multitarea
 

Similar a Chap 15dpin

Computación 3 sb04003 2013
Computación 3 sb04003 2013Computación 3 sb04003 2013
Computación 3 sb04003 2013Maestros Online
 
Conexion mysql con java usando netbeans
Conexion mysql con java usando netbeansConexion mysql con java usando netbeans
Conexion mysql con java usando netbeansEmerson Garay
 
Primeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier AznarPrimeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier AznarPablo Aguilera
 
Formulario
FormularioFormulario
FormularioRandy
 
Guia BD conexión Mysql con Java usando Netbeans
Guia BD conexión Mysql con Java usando NetbeansGuia BD conexión Mysql con Java usando Netbeans
Guia BD conexión Mysql con Java usando NetbeansEmerson Garay
 
Conexion de c sharp a my sql
Conexion de c sharp a my sqlConexion de c sharp a my sql
Conexion de c sharp a my sqlJulian Benavidez
 
Conexion Entre Php Y Mysqul
Conexion Entre Php Y MysqulConexion Entre Php Y Mysqul
Conexion Entre Php Y Mysquljuan_j_condolo
 
Linq to sql 7
Linq to sql 7Linq to sql 7
Linq to sql 7jcfarit
 

Similar a Chap 15dpin (20)

Conexión de Base de Datos
Conexión de Base de DatosConexión de Base de Datos
Conexión de Base de Datos
 
Computación 3
Computación 3Computación 3
Computación 3
 
My Sql A C#
My Sql A C#My Sql A C#
My Sql A C#
 
My Sql A C#
My Sql A C#My Sql A C#
My Sql A C#
 
Mvc
MvcMvc
Mvc
 
Computación 3
Computación 3Computación 3
Computación 3
 
Computación 3 sb04003 2013
Computación 3 sb04003 2013Computación 3 sb04003 2013
Computación 3 sb04003 2013
 
Computación 3 sb04003 2013
Computación 3 sb04003 2013Computación 3 sb04003 2013
Computación 3 sb04003 2013
 
Conexion mysql con java usando netbeans
Conexion mysql con java usando netbeansConexion mysql con java usando netbeans
Conexion mysql con java usando netbeans
 
Primeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier AznarPrimeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier Aznar
 
Practica9 bases de datos
Practica9 bases de datosPractica9 bases de datos
Practica9 bases de datos
 
Practica9 bases de datos
Practica9 bases de datosPractica9 bases de datos
Practica9 bases de datos
 
Practica 4
Practica 4Practica 4
Practica 4
 
Computación 2 java
Computación 2 javaComputación 2 java
Computación 2 java
 
Formulario
FormularioFormulario
Formulario
 
Guia BD conexión Mysql con Java usando Netbeans
Guia BD conexión Mysql con Java usando NetbeansGuia BD conexión Mysql con Java usando Netbeans
Guia BD conexión Mysql con Java usando Netbeans
 
Conexion de c sharp a my sql
Conexion de c sharp a my sqlConexion de c sharp a my sql
Conexion de c sharp a my sql
 
Conexion Entre Php Y Mysqul
Conexion Entre Php Y MysqulConexion Entre Php Y Mysqul
Conexion Entre Php Y Mysqul
 
Guia7 java
Guia7 javaGuia7 java
Guia7 java
 
Linq to sql 7
Linq to sql 7Linq to sql 7
Linq to sql 7
 

Último

CULTURA NAZCA, presentación en aula para compartir
CULTURA NAZCA, presentación en aula para compartirCULTURA NAZCA, presentación en aula para compartir
CULTURA NAZCA, presentación en aula para compartirPaddySydney1
 
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIARAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIACarlos Campaña Montenegro
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxOscarEduardoSanchezC
 
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Carlos Muñoz
 
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARONARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFAROJosé Luis Palma
 
Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.José Luis Palma
 
Estrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdfEstrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdfromanmillans
 
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptxLINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptxdanalikcruz2000
 
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptxOLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptxjosetrinidadchavez
 
FICHA DE MONITOREO Y ACOMPAÑAMIENTO 2024 MINEDU
FICHA DE MONITOREO Y ACOMPAÑAMIENTO  2024 MINEDUFICHA DE MONITOREO Y ACOMPAÑAMIENTO  2024 MINEDU
FICHA DE MONITOREO Y ACOMPAÑAMIENTO 2024 MINEDUgustavorojas179704
 
codigos HTML para blogs y paginas web Karina
codigos HTML para blogs y paginas web Karinacodigos HTML para blogs y paginas web Karina
codigos HTML para blogs y paginas web Karinavergarakarina022
 
DE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.ppt
DE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.pptDE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.ppt
DE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.pptELENA GALLARDO PAÚLS
 
BROCHURE EXCEL 2024 FII.pdfwrfertetwetewtewtwtwtwtwtwtwtewtewtewtwtwtwtwe
BROCHURE EXCEL 2024 FII.pdfwrfertetwetewtewtwtwtwtwtwtwtewtewtewtwtwtwtweBROCHURE EXCEL 2024 FII.pdfwrfertetwetewtewtwtwtwtwtwtwtewtewtewtwtwtwtwe
BROCHURE EXCEL 2024 FII.pdfwrfertetwetewtewtwtwtwtwtwtwtewtewtewtwtwtwtwealekzHuri
 
programa dia de las madres 10 de mayo para evento
programa dia de las madres 10 de mayo  para eventoprograma dia de las madres 10 de mayo  para evento
programa dia de las madres 10 de mayo para eventoDiegoMtsS
 
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyzel CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyzprofefilete
 

Último (20)

CULTURA NAZCA, presentación en aula para compartir
CULTURA NAZCA, presentación en aula para compartirCULTURA NAZCA, presentación en aula para compartir
CULTURA NAZCA, presentación en aula para compartir
 
Defendamos la verdad. La defensa es importante.
Defendamos la verdad. La defensa es importante.Defendamos la verdad. La defensa es importante.
Defendamos la verdad. La defensa es importante.
 
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIARAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
 
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
 
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARONARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
 
Repaso Pruebas CRECE PR 2024. Ciencia General
Repaso Pruebas CRECE PR 2024. Ciencia GeneralRepaso Pruebas CRECE PR 2024. Ciencia General
Repaso Pruebas CRECE PR 2024. Ciencia General
 
Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.
 
Estrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdfEstrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdf
 
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptxLINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
LINEAMIENTOS INICIO DEL AÑO LECTIVO 2024-2025.pptx
 
Unidad 3 | Teorías de la Comunicación | MCDI
Unidad 3 | Teorías de la Comunicación | MCDIUnidad 3 | Teorías de la Comunicación | MCDI
Unidad 3 | Teorías de la Comunicación | MCDI
 
La Trampa De La Felicidad. Russ-Harris.pdf
La Trampa De La Felicidad. Russ-Harris.pdfLa Trampa De La Felicidad. Russ-Harris.pdf
La Trampa De La Felicidad. Russ-Harris.pdf
 
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptxOLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
 
FICHA DE MONITOREO Y ACOMPAÑAMIENTO 2024 MINEDU
FICHA DE MONITOREO Y ACOMPAÑAMIENTO  2024 MINEDUFICHA DE MONITOREO Y ACOMPAÑAMIENTO  2024 MINEDU
FICHA DE MONITOREO Y ACOMPAÑAMIENTO 2024 MINEDU
 
codigos HTML para blogs y paginas web Karina
codigos HTML para blogs y paginas web Karinacodigos HTML para blogs y paginas web Karina
codigos HTML para blogs y paginas web Karina
 
DE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.ppt
DE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.pptDE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.ppt
DE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.ppt
 
BROCHURE EXCEL 2024 FII.pdfwrfertetwetewtewtwtwtwtwtwtwtewtewtewtwtwtwtwe
BROCHURE EXCEL 2024 FII.pdfwrfertetwetewtewtwtwtwtwtwtwtewtewtewtwtwtwtweBROCHURE EXCEL 2024 FII.pdfwrfertetwetewtewtwtwtwtwtwtwtewtewtewtwtwtwtwe
BROCHURE EXCEL 2024 FII.pdfwrfertetwetewtewtwtwtwtwtwtwtewtewtewtwtwtwtwe
 
programa dia de las madres 10 de mayo para evento
programa dia de las madres 10 de mayo  para eventoprograma dia de las madres 10 de mayo  para evento
programa dia de las madres 10 de mayo para evento
 
Earth Day Everyday 2024 54th anniversary
Earth Day Everyday 2024 54th anniversaryEarth Day Everyday 2024 54th anniversary
Earth Day Everyday 2024 54th anniversary
 
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyzel CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
 

Chap 15dpin

  • 1. Multithreading Issues Hemos discutido las tres formas de crear un hilo y hasta este punto sólo hemos mostrado como crear e iniciar un hilo lo cual es la parte fácil. La parte difícil es garantizar que los hilos se comporten en la manera que mantengan la integridad del programa y los datos involucrados. Los hilos en un programa se encuentran en el mismo proceso en memoria y por eso tienen acceso a la misma memoria.
  • 2. Multithreading Issues Debido a que no se tiene control sobre cuando un hilo es planificado, nunca se sabe cuando un hilo se detendrá y tiene que regresar a la cola de prioridad. Un hilo puede encontrarse en el medio de una tarea de datos sensitivos y el hilo que actualmente esta corriendo puede desordenar las cosas mientras que otros hilos esperan para correr.
  • 3. Multithreading Issues No es difícil de presentar un ejemplo para demostrar como dos hilos pueden hacer que los datos no sean válidos. Tomemos la siguiente clase BankAccount la cual representa una simple cuenta bancaria con un número, balance y métodos para hacer depósitos y retiros.
  • 4. public class BankAccount { private double balance; private int number; public BankAccount(int number, double initialBalance){ balance = initialBalance; } public int getNumber(){ return number; } public double getBalance() { return balance; }
  • 5. public void deposit(double amount) { double prevBalance = balance; balance = prevBalance + amount; } public void withdraw(double amount) { double prevBalance = balance; balance = prevBalance - amount; } }
  • 6. Multithreading Issues La clase BankAccount se ve suficientemente simple; pero verifique la siguiente clase BankTeller que hace un depósito de $100 en el objeto BankAccount.
  • 7. public class BankTeller extends Thread { private BankAccount account; public BankTeller(BankAccount a) { account = a; } public void run() { System.out.println(this.getName() + " depositing $100..."); account.deposit(100.00); } }
  • 8. Multithreading Issues Nuevamente la clase BankTeller se ve suficientemente simple. Para hacer una prueba de las clases BankTeller y BankAccount, se ha escrito un programa llamado SomethingsWrong el cual crea un simple objeto BankAccount y dos hilos BankTeller.
  • 9. public class SomethingsWrong { public static void main(String [] args) { BankAccount account = new BankAccount(101, 1000.00); System.out.println("Initial balance: $" + account.getBalance()); Thread teller1 = new BankTeller(account); Thread teller2 = new BankTeller(account); teller1.start(); teller2.start(); Thread.yield(); System.out.println("Withdrawing $200..."); account.withdraw(200); System.out.println("nFinal balance: $" + account.getBalance()); } }
  • 10. Multithreading Issues Se ha agregado una invocación llamado al método yield() de tal manera que el hilo main() le da a los hilos BankTeller una oportunidad de ejecutarse primero, por eso se incrementa la probabilidad de que los dos depósitos ocurren antes del retiro. Esto no garantiza que los depósitos ocurrirán primero, y que el balance final sea $1000.0, con o sin el llamado a yield() en el main().
  • 11. Multithreading Issues La salida del programa SomethingsWrong se ve consistente con la lógica del programa:  El balance inicial es $1000, los dos depósitos de $100 se realizaron, un retiro de $200 también se realizó, por eso el balance final debe ser de $1000, lo cual es así.
  • 12. Multithreading Issues No se ha nombrado al programa SomethingsWrong sin razón, he tenido la pretensión de que este programa trabaja debido a pura suerte. Los dos hilos BankTeller tienen una referencia al mismo objeto BankAccount. En otras palabras dos hilos comparten la misma memoria. Los hilos corren lo suficientemente rápido de tal manera que ellos no se bloquean en medio de su corrida. Sin embargo, si ellos se hubiesen bloqueado por alguna razón, un resultado diferente habría ocurrido.
  • 13. Multithreading Issues Para probar esta teoría se ha agregado un llamado al método sleep() en los métodos deposit() y withdraw() de BankAccount, forzando a que los hilos BankTeller sean bloqueados en el medio de la transacción:
  • 14. public void deposit(double amount) { double prevBalance = balance; try { Thread.sleep(4000); }catch(InterruptedException e) {} balance = prevBalance + amount; }
  • 15. public void withdraw(double amount) { double prevBalance = balance; try { Thread.sleep(4000); }catch(InterruptedException e) {} balance = prevBalance - amount; }
  • 16.
  • 17.
  • 18.
  • 19. Multithreading Issues Al agregar el llamado a sleep() se fuerza a los hilos a cambiar la ejecución. Al ejecutar nuevamente el programa SomethigsWrong se generan resultados diferentes, Después de dos depósitos de $100, seguido del retiro de $200, el balance debería ser de $1000, pero por alguna razón es de solo $800.
  • 20. Multithreading Issues En el entorno del mundo real en el que se involucra el dinero, este resultado no es aceptable, especialmente para el cliente al cual le aparece que ha perdido $200. El problema surge por que los tres hilos ( main() y los dos cajeros del banco ) están accediendo los mismos datos en la memoria al mismo tiempo.
  • 21. Multithreading Issues Cuando se trabaja con información de datos sensitivos tal como el balance de una cuenta de banco, múltiples hilos accediendo los datos es lo que ha ocurrido. Por ejemplo, si el depósito se va a hacer, no se debe permitir ninguna otra transacción que afecte el balance hasta que el depósito termine. Esto se puede hacer sincronizando los hilos.
  • 22. synchronized Keyword La clase BankAccount de la sección anterior claramente no es un hilo seguro. Múltiples hilos pueden hacer depósitos y retiros que no han sido implementados satisfactoriamente. Para hacer que la clase sea de hilos seguros, se pueden tomar las ventajas de las características de la sincronización construidas en el lenguaje Java.
  • 23. synchronized Keyword La palabra clave synchronized en Java crea un bloque de código el cual es referido como “sección crítica”. Cualquier objeto con una sección crítica de código obtiene un cerrojo asociado con el objeto. Para entrar a la sección crítica, un hilo necesita obtener el correspondiente objeto cerrojo.
  • 24. synchronized Keyword Para corregir el problema con la clase BankAccount, necesitamos crear una sección crítica alrededor del código de datos sensitivos de los métodos deposit() y withdraw(). Cuando usamos la palabra clave synchronized para crear esta sección critica, Se debe especificar que cerrojo va a hacer pedido al pasar en una referencia al objeto que tiene el cerrojo.
  • 25. synchronized Keyword Por ejemplo el siguiente método deposit() sincroniza al objeto BankAccount:
  • 26. synchronized Keyword public void deposit(double amount){ double prevBalance = balance; synchronized(this){ try { Thread.sleep(4000); }catch(InterruptedException e){} balance = prevBalance + amount; } }
  • 27. synchronized Keyword La palabra clave synchronized es comúnmente usada dentro de una clase para hacer el hilo sea seguro. En este caso, la sección critica esta sincronizada en la referencia this. Una forma alterna de sincronizar en la referencia this es declarar el método entero como syncronized. Por ejemplo:
  • 28. synchronized Keyword Por ejemplo: public synchronized void withdraw( double amount ) { // Method definition }
  • 29. synchronized Keyword Cuando el método sincronizado withdraw() es invocado, el hilo actual intentará obtener el cerrojo en este objeto y liberar este objeto cuando el método termine su ejecución.
  • 30. synchronized Keyword Sincronizar el método entero es preferido sobre la sincronización en la referencia this dentro del método por que esto permite que la JVM maneje el método que llama y la sincronización sea más eficiente. También, esto le permite a los usuarios de la clase, ver por la firma del método, que este método esta sincronizado.
  • 31. synchronized Keyword Esto nos dice, que los métodos no se deben sincronizar arbitrariamente a menos que este sea necesariamente para un hilo seguro y de tal forma que no creen innecesariamente secciones críticas. Si un método tiene 50 líneas de código, y se necesita sincronizar sólo tres líneas de estas, no se debe sincronizar el método entero.
  • 32. synchronized Keyword Colgarse de un cerrojo cuando este no es necesario puede tener repercusiones considerables sobre el rendimiento, especialmente si otro hilo esta en espera del cerrojo.
  • 33. synchronized Keyword Se ha creado una nueva clase llamada ThreadSafeBankAccount que contiene el método deposit(). En adición, se ha agregado la palabra clave synchronized al método withdraw(). También se ha modificado la clase BankTeller, por la clase Bankteller2, así este hace su depósito de $100 en el objeto ThreadSafeBankAccount.
  • 34. synchronized Keyword El programa SomethingFixed es idéntico al programa SomethigsWrong excepto que este usa las clases ThreadSafeBankAccount y BankTeller2.
  • 35. public class ThreadSafeBankAccount { private double balance; private int number; public ThreadSafeBankAccount(int number, double initialBalance) { this.number = number; balance = initialBalance; } public int getNumber() { return number; } public double getBalance() { return balance; }
  • 36. public void deposit(double amount) { synchronized(this) { double prevBalance = balance; try { Thread.sleep(4000); }catch(InterruptedException e) {} balance = prevBalance + amount; } }
  • 37. public synchronized void withdraw(double amount) { double prevBalance = balance; try { Thread.sleep(4000); }catch(InterruptedException e) {} balance = prevBalance - amount; } }
  • 38. public class BankTeller2 extends Thread { private ThreadSafeBankAccount account; public BankTeller2(ThreadSafeBankAccount a) { account = a; } public void run() { System.out.println(this.getName() + " depositing $100..."); account.deposit(100.00); } }
  • 39. public class SomethingsFixed { public static void main(String [] args) { ThreadSafeBankAccount account = new ThreadSafeBankAccount(101, 1000.00); System.out.println("Initial balance: $" + account.getBalance()); Thread teller1 = new BankTeller2(account); Thread teller2 = new BankTeller2(account); teller1.start(); teller2.start(); Thread.yield(); System.out.println("Withdrawing $200..."); account.withdraw(200); System.out.println("nFinal balance: $" + account.getBalance()); } }
  • 40. synchronized Keyword La salida es: Initial balance: $1000.0 Thread-0 deposit $100… Thread-1 deposit $100… withdrawing $200… Final balance: $1000.0
  • 41. synchronized Keyword Dos cosas se notarán al correr el programa SomethingsFixed:  Este toma más tiempo de ejecución.  trabaja correctamente esta vez. Esto es debido a que el depósito y el retiro no ocurren al mismo tiempo como estaban en el programa SomethingWrong, en su lugar ellos corren secuencialmente ( uno a la vez ).