Imagem de fundo

Analise o seguinte programa em Java SE 11: class Contador { int valor = 0; void increme...

Analise o seguinte programa em Java SE 11:


class Contador {

int valor = 0;


void incrementar() {

valor++;

}

}


public class Teste {


public static void main(String[] args) throws Exception {


Contador c = new Contador();


Thread t1 = new Thread(() -> {

for(int i = 0; i < 1000; i++)

c.incrementar();

});


Thread t2 = new Thread(() -> {

for(int i = 0; i < 1000; i++)

c.incrementar();

});


t1.start();

t2.start();


t1.join();

t2.join();


System.out.println(c.valor);

}

}


Considerando a execução concorrente das threads e o funcionamento da instrução valor++. E, ainda, que a JVM pode intercalar as operações das threads de forma imprevisível e que a operação de incremento (valor++) não é atômica na especificação Java, assinale a alternativa correta.


A

O uso de join() garante que não haverá interferência entre as threads.


B

O programa sempre imprimirá 1000, pois apenas uma thread executa por vez.


C

O programa não compila, pois múltiplas threads não podem acessar a mesma variável.


D

O programa sempre imprimirá exatamente 2000, pois cada thread incrementa o contador mil vezes.


E

O programa pode imprimir um valor menor que 2000, devido a condições de corrida durante a execução concorrente.