Hola dejo el ejercicio CU00911C Paquete java.lang. Interfaces, clases (String, Stringbuffer, StringBuilder) Concepto de inmutabilidad.
EJERCICIO
En esta entrega hemos podido ver lo siguiente: StringBuilder puede ofrecer resultados no consistentes en una ejecución multihilo (concurrente, con distintos “subprogramas” ejecutándose simultáneamente) ya que sus métodos no son sincronizados.
Busca información en internet y trata de poner un ejemplo de cómo podría generarse una inconsistencia en programación multihilo. No hace falta que escribas código, únicamente es necesario describir en unas pocas líneas (como si estuvieras explicándoselo a un amigo) la idea o situación.
Buscando en internet he encontrado este ejemplo y creo que es muy bueno par explicar la inconsistencia entre hilos de java.:
Suponga un simple campo int definido e inicializado:
int counter = 0;
el campo counter es compartido entre dos hilos, A y B. Suponga que el hilo A incrementa counter.
counter ++;
Entonces enseguida el hilo B imprime counter:
System.out.println (counter);
Si las dos sentencias han sido ejecutado en el mismo hilo, sería seguro asumir que el valor impreso podría ser “1”.
Pero si las dos sentencias son ejecutadas en hilos separados, el valor impreso podría ser “0”, porque no hay garantía que el cambio hecho por el hilo A a counter va a ser visible al hilo B -- amenos que el programador haya establecido una relación sucede-antes entre estas dos sentencias.
Si tenemos dos procedimientos diferentes y en uno incrementamos counter++ y en otro presentamos por pantalla counter, para que no haya inconsistencia se tendría que llamar al procedimiento que incrementa el contador antes de llamar a presentar por pantalla.
Si se llamara al procedimiento que presenta por pantalla el counter antes de incrementarlo no presentaríamos un valor real del counter (o si porque igual queremos presentar ese valor sin incremento) lo cual da lugar a inconsistencia de los datos ya que al trabajar con dos hilos diferentes sin sincronizar no presenta los datos reales.
Como dice Ogramar en
https://aprenderaprogramar.com/foros/index.php?topic=6848.msg25434#msg25434Supongamos una aplicación multihilo donde un hilo 1 se encarga de realizar la reserva de un determinado asiento en un avión, mientras que otro hilo 2 se encarga de consultar los asientos libres en el avión para servirlos a una página web e informar así a un usuario que quiere realizar una compra o reserva.
Supongamos que los asientos y si están libres u ocupados están localizados en una estructura de datos localizada en ciertas posiciones de memoria principal cuya escritura requiere 2 segundos y cuya lectura requiere 1 segundo (ejemplo no real).
Supongamos que a las 10:00:00 una persona ha comprado un asiento pero la escritura no se ha formalizado hasta las 10:00:02, mientras que otra persona ha consultado los asientos libres a las 10:00:01.
Si no existe sincronización, implica que no está establecido quién tiene preferencia para usar el recurso, en este caso la memoria, y el resultado sería que la persona que ha consultado el estado de los asientos obtendría como resultado que el asiento que ha comprado la otra persona está libre.
Cuando existe sincronización, implicaría que sí está establecido quién tiene preferencia para usar el recurso, y el resultado sería que la persona que ha consultado el estado de los asientos no podría conocerlo hasta que termine el otro hilo de trabajar.
Gracias.
Un Saludo