1
resposta

Minha implementação

Olá, segue minha implementação referente a aula de hoje

Realizei algumas modificações interessantes para facilitar meu entendimento.

Segue:

Classe Principal:

package br.com.alura.threads.lista.lista_thread_safe;

import java.util.List;
import java.util.Scanner;

public class Principal {
    
    private static final Integer NUM_POSSIBILIDADES = 10000;
    
    public static void main(String[] args) throws InterruptedException {
        
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("Em primeiro lugar, implementa\u00E7\u00F5es que utilizam ArrayList<String> n\u00E3o s\u00E3o sincronizadas. Seguem op\u00E7\u00F5es para escolher qual implementa\u00E7\u00E3o testar:");
        System.out.println("[1] - Testar com ArrayList mesmo - (n\u00E3o s\u00E3o sincronizadas)");
        System.out.println("[2] - Primeira op\u00E7\u00E3o: Collections.synchronizedList() - (\u00E9 sincronizada)");
        System.out.println("[3] - Segunda op\u00E7\u00E3o: Utilizar java.util.Vector - (\u00E9 sincronizada)");
        System.err.println("[4] - Sair");
        Integer opcao = scanner.nextInt();
        
        if (opcao == 4) {
            scanner.close();
            
            System.out.println();
            System.err.println("Opera\u00E7\u00E3o finalizada!!");
            
            return;
        }
        
        scanner.close();
        
        Lista lista = new Lista();
        lista.inicializaLista(opcao);
        List<String> elementos = lista.getElementos();
        
        for (int i = 0; i < 100; i++) {
            new Thread(new TarefaLista(elementos, i)).start();
        }
        
        for (int i = 0; i < elementos.size(); i++) {
            System.out.println(lista.pegaElemento(i));
        }
        
        System.err.println("Tamanho da lista: " + lista.tamanho(elementos));
        System.err.println("Faltam " + (NUM_POSSIBILIDADES - lista.tamanho(elementos)) + " elementos");
        
        Thread.sleep(2500);
        
        System.out.println();
        System.err.println("Opera\u00E7\u00E3o finalizada!!");
    }

    

}

Classe Lista:

package br.com.alura.threads.lista.lista_thread_safe;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Vector;

public class Lista {
    
    private List<String> elementos;
    
    public void inicializaLista(Integer opcao) {
        switch (opcao) {
        case 1:
            this.elementos = new ArrayList<String>();
            break;
        case 2:
            this.elementos = Collections.synchronizedList(new ArrayList<String>());
            break;
        case 3:
            this.elementos = new Vector<String>();
            break;
        default:
            break;
        }
    }
    
    public void adicionaElementos(String elemento) {
        this.getElementos().add(elemento);
    }
    
    public Integer tamanho(List<String> lista) {
        return this.getElementos().size();
    }
    
    public String pegaElemento(Integer indice) {
        
        String elemento = "";
        try {
            elemento =  this.getElementos().get(indice);
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
        
        if (elemento == "") {
            elemento = "Elemento n\u00E3o encontrado!";
        }
        
        return elemento;
    }

    public List<String> getElementos() {
        return elementos;
    }

    public void setElementos(List<String> elementos) {
        this.elementos = elementos;
    }
    
}

Classe TarefaLista:

package br.com.alura.threads.lista.lista_thread_safe;

import java.util.List;

public class TarefaLista implements Runnable {
    
    private List<String> lista;
    private Integer contador;
    
    public TarefaLista(List<String> lista, Integer contador) {
        this.lista = lista;
        this.contador = contador;
    }
    
    @Override
    public void run() {
        
        adicionaElementoNaLista(lista, contador);
        
    }

    private void adicionaElementoNaLista(List<String> listaElemento, Integer contadorElemento) {
        for (int i = 0; i < 100; i++) {
            listaElemento.add("Thread " + contadorElemento + " - " + i);
        }
        
    }
    

}

Obrigado.

1 resposta

Olá Gustavo!

Pelo que entendi, você está estudando sobre listas sincronizadas em Java e está com uma dúvida sobre a implementação que você fez.

Na sua implementação, você criou uma classe Lista que possui um método inicializaLista que recebe um número de opção e inicializa a lista de acordo com essa opção. No método main da classe Principal, você cria uma instância da classe Lista, chama o método inicializaLista passando a opção escolhida e em seguida, cria várias threads que executam a classe TarefaLista, passando a lista e um contador como parâmetros.

Depois disso, você percorre a lista e imprime os elementos, além de exibir o tamanho da lista e a quantidade de elementos que faltam para atingir um número específico.

Aparentemente, você está utilizando a classe ArrayList para implementar a lista, mas está em dúvida se essa implementação é thread-safe.

Na verdade, a classe ArrayList não é thread-safe, ou seja, não é segura para ser usada em ambientes concorrentes. Isso significa que se várias threads estiverem acessando e modificando a mesma lista ao mesmo tempo, podem ocorrer problemas de concorrência, como elementos nulos ou exceções.

Uma alternativa para tornar a lista thread-safe é utilizar a classe Collections.synchronizedList, que retorna uma lista sincronizada a partir de uma lista existente. Por exemplo:

List<String> lista = Collections.synchronizedList(new ArrayList<String>());

Dessa forma, você pode utilizar essa lista sincronizada em suas threads, garantindo que as operações de adição e leitura sejam feitas de forma segura.

Outra opção é utilizar a classe Vector, que já é implementada de forma thread-safe. Por exemplo:

List<String> lista = new Vector<String>();

Essa classe também implementa a interface List e é adequada para uso em ambientes concorrentes.

Espero ter esclarecido sua dúvida! Se tiver mais alguma pergunta, é só me dizer. Bons estudos!

Espero ter ajudado e bons estudos!