Autor Tema: java Stringbuffer StringBuilder inconsistencia programación multihilo CU00911C#  (Leído 572 veces)

LuisM

  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 131
    • Ver Perfil
Hola a todos !! Paso a dejar la respuesta del ejercicio CU00911C del manual pdf de programación java avanzada. Desde ya muchas gracias. Un saludo, Luis


EJERCICIO

Citar
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.

La clase String es una clase no modificable. Esto quiere decir que cuando se modifica un String se crea un nuevo objeto String modificado a partir del original y el recolector de basura es el encargado de eliminar de la memoria el String original, eso origina un uso mayor de los recursos.

En general decidiremos cuando usar String, StringBuilder o StringBuffer según lo siguiente:
-Usaremos String si la cadena de caracteres no va a cambiar.
-Usaremos StringBuilder si la cadena de caracteres puede cambiar y solamente tenemos un hilo de ejecución.
-Usaremos StringBuffer si la cadena de caracteres puede cambiar y tenemos varios hilos de ejecución.

StringBuilder (llegó con Java 5),  no es síncrona, lo que significa que puede haber problemas si a una variable la acceden diferentes threads. Sin embargo, para la mayoría de las aplicaciones (donde se ejecuta un solo hilo) supone una mejora de rendimiento sobre StringBuffer.

La diferencia entre un StringBuilder y un StringBuffer es que un StringBuffer provee métodos sincronizados por lo que es seguro usarlos en un ambiente multi-hilos. Un StringBuffer se comporta de manera consistente con el orden de las llamadas a los métodos hechas por cada hilo.

StringBuilder es rápido ya que no es seguro al utilizarse en los hilos, no es thread safe.
Con varias ejecuciones, los tiempos son constantemente menores para el StringBuilder. Por ejemplo, concatenar 100000 cadenas con:
.String: 300000 milisegundos
.StringBuffer: 30 milisegundos
.StringBuilder: 15 milisegundos
(los valores dependen del ordenador usado-es a modo de ejemplo)
« última modificación: 20 de Marzo 2018, 21:15 de Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2488
    • Ver Perfil
Buenas LuisM, veo tu respuesta correcta. Por comentar algo más trataré de poner un ejemplo, aunque no es sencillo hablar de hilos pues es un concepto relativamente avanzado y muchos programadores no los utilizan precisamente por su carácter avanzado:

Supongamos 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.

No es un ejemplo real, pero creo que puede servir para entender cómo puede generarse una incosistencia en programación multihilo si no existe sicronización.

Salu2

 

Esto es un laboratorio de ideas...
Aprender a programar

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".