1
resposta

[Sugestão] StringBuffer garante integridade dos dados, mas não a ordem de execução das threads.

No código original da correção, a ordem de impressão era assumida incorretamente. Além disso, os laços for não incluíam o 100 e o 200. Segue o código ajustado:

package med.voll.api.testes.memoria;

public class TestaString { public static void main(String[] args) throws InterruptedException { StringBuffer resultado = new StringBuffer();

    var thread1 = new Thread(()->
    {
        for(int i = 1; i<=100; i++){
            resultado.append(i);
            resultado.append(" ");
        }
    });

    var thread2 = new Thread(()->
    {
        for(int i = 101; i<=200; i++){
            resultado.append(i);
            resultado.append(" ");
        }
    });

    thread1.start();
    thread1.join(); // aguarda thread1 terminar
    thread2.start();
    thread2.join();

    System.out.println(resultado);

}

}

Lógica: Corrige os limites dos loops para incluir os extremos.

Concorrência controlada: thread1.start(); thread1.join(); garante que a thread1 finalize antes de thread2 iniciar.

Isso garante que os números de 1 a 100 sejam sempre adicionados antes dos de 101 a 200.

Segurança de dados: O uso de StringBuffer, que é thread-safe, previne problemas de concorrência caso as threads sejam executadas simultaneamente, embora neste código elas rodem de forma sequencial.

Quando as threads são executadas simultaneamente, há potencial ganho de desempenho e, com StringBuffer, a integridade dos dados compartilhados é garantida; porém, a ordem da saída concatenada não é garantida.

1 resposta

Olá Daniel! Tudo certo?

Você fez um ótimo trabalho ao ajustar o código para garantir que os laços incluam os números 100 e 200, e também ao controlar a ordem de execução das threads com thread1.join(). Isso realmente assegura que os números de 1 a 100 sejam sempre adicionados antes dos de 101 a 200.

Sobre a sua observação a respeito do StringBuffer, você está absolutamente certo. O StringBuffer é thread-safe, o que significa que ele pode ser usado em ambientes multithread sem risco de corrupção de dados. No entanto, como você mencionou, isso não garante a ordem de execução das threads quando elas são executadas simultaneamente. No seu caso, você controlou a ordem de execução usando join(), o que é uma ótima abordagem para garantir que a saída seja sempre na ordem esperada.

Se você estivesse usando StringBuilder no lugar de StringBuffer sem o uso de join(), poderia enfrentar problemas de concorrência, resultando em uma saída desordenada ou até mesmo corrompida, já que StringBuilder não é thread-safe.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!