

Seu próximo nível começa aqui
Seu desenvolvimento não pode ter limites. Garanta sua Assinatura Ilimitada e libere uma preparação completa com os melhores professores do Brasil.
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.
O uso de join() garante que não haverá interferência entre as threads.
O programa sempre imprimirá 1000, pois apenas uma thread executa por vez.
O programa não compila, pois múltiplas threads não podem acessar a mesma variável.
O programa sempre imprimirá exatamente 2000, pois cada thread incrementa o contador mil vezes.
O programa pode imprimir um valor menor que 2000, devido a condições de corrida durante a execução concorrente.