Joven hacker sonriendo

Crear Contenedores No Sincronizados

Nuestros ethical hackers explican que son las clases contenedoras y en que circunstancias es recomendable usarlas dentro del código. Por último, muestran un ejemplo de su implementación en el lenguaje de programación Java usando las clases StringBuilder y ArrayList...

Necesidad

Crear contenedores de objetos optimizados cuando no se requieren hilos en Java.

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. No es una variable compartida que pueda ser accedida por diferentes hilos (no se requiere sincronización).

Solución

Los contenedores son clases o estructuras de datos cuyas instancias son colecciones de otros objetos. Es decir, almacenan objetos de manera ordenada siguiendo determinadas reglas de acceso y control. El tamaño de dichos contenedores es determinado por la cantidad de elementos que contiene, además, proporcionan flexibilidad para elegir la implementación correcta para cualquier escenario dado.

Java ofrece dos tipos de implementaciones para clases contenedoras:

  • Sincronizada: Varios hilos pueden modificar el contenedor y esta quedará en estado consistente.

  • No sincronizada: Varios hilos, al modificar el contenedor, pueden afectar la consistencia del mismo.

Normalmente siempre debería utilizarse la implementación sincronizada, pero esta siempre implica un rendimiento menor dado que internamente implementa mecanismos de control y concurrencia como son los semáforos y/o monitores [1].

Por lo tanto, se puede determinar que la decisión óptima de rendimiento, cuando un contenedor puede no ser modificado por varios hilos, es utilizar implementaciones no sincronizadas.

Una implementación de clase contenedora sincronizada es la clase Vector [2] y de clase no sincronizada es ArrayList [3]. De igual modo ocurre con StringBuffer [4] y StringBuilder [5] respectivamente.

  1. En esta solución se mostrará la creación de un contenedor usando las clases no sincronizadas StringBuilder y ArrayList.

  2. Se importan las clases del paquete java.util. La clases StringBuilder no requiere ser importada porque pertenece al paquete java.lang.

    Main.java
    1
    2
    import java.util.List;
    import java.util.ArrayList;
    
  3. Definimos una clase que simplemente creará los contenedores y les asignará los String FLUID y después SIGNAL.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    public class Main {
      public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        sb.append("FLUID");
        sb.append("SIGNAL");
        System.out.println(sb);
        List<String> lista = new ArrayList<String>();
        lista.add("FLUID");
        lista.add("SIGNAL");
        System.out.println(lista);
      }
    }
    
  4. Debido a que la aplicación anterior no hace uso de hilos, se usaron las versiones no sincronizadas de los contenedores.

  5. Siempre que se pueda usar una Interfaz para definir una variable, es preferible definirla usando el nombre de la clase, lo cual permitirá cambiar a la versión sincronizada más fácilmente si en algún momento llegase a ser necesario. En el código anterior esto se puede observar durante la creación de la lista.

  6. Por último, se compila y se ejecuta la aplicación.

    1
    2
    3
    4
    % javac Main.java
    % java Main
    FLUIDSIGNAL
    [FLUID, SIGNAL]
    

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

Main.java Uso de clases no sincronizadas.




Haz un comentario

Estado de los servicios - Términos de Uso