Questão nº 13

Questão de Tecnologia da Informação · FGV CVM 2024 (nº 13)

FGV2024Analista CVM - TI Sistemas e Desenvolvimento (Perfil 8)Tecnologia da Informação
Gabarito: Ever comentário ↓

Considere o seguinte código em Java:

import java.util.concurrent.atomic.AtomicInteger;
class MultiSomador extends Thread {
 int n = 1_000;
 int saida = 1;
 AtomicInteger contagem = new AtomicInteger(1);
 public void run() {
  for (short i = 0; i < n; i++)
   saida = contagem.getAndIncrement();
 }
}
public class Principal {
 public static void main(String[] args)
  throws InterruptedException {
  MultiSomador a = new MultiSomador();
  Thread b = new Thread(a, "b");
  Thread c = new Thread(a, "c");
  b.start(); b.join(0);
  c.start(); c.join(0);
  System.out.print(a.contagem+", "+a.saida);
 }
}

Ao ser executado em um ambiente Java com suporte à classe de biblioteca AtomicInteger, o código acima imprime na saída padrão:

Resposta comentada

Gabarito Alternativa E

O conceito-chave aqui é a execução sequencial de threads garantida pelo Thread.join(0) e o uso de um contador atômico (AtomicInteger) para atualizações seguras. AtomicInteger é um tipo de número inteiro que pode ser atualizado por várias partes do programa (threads) ao mesmo tempo sem causar erros, garantindo que cada atualização seja completa e não seja interrompida. Thread.join(0) é um comando que faz o programa principal esperar infinitamente até que a thread que ele está esperando termine completamente sua execução.

  • (A) Incorreta: Esta alternativa sugere que o contador e a variável saida não foram alterados, o que não ocorre, pois as threads executam os laços de incremento.
  • (B) Incorreta: Não há condições para que uma exceção seja lançada neste código. AtomicInteger foi projetado para lidar com concorrência de forma segura.
  • (C) Incorreta: Esta seria a saída se apenas uma das threads executasse e o AtomicInteger iniciasse em 0, ou se houvesse uma interpretação incorreta do getAndIncrement(). No entanto, duas threads executam sequencialmente e o contador inicia em 1.
  • (D) Incorreta: Esta alternativa seria tentadora se o AtomicInteger contagem tivesse sido inicializado com 0 em vez de 1. Se contagem começasse em 0, após 2000 incrementos, seu valor final seria 2000, e o último valor atribuído a saida (que é o valor antes do último incremento) seria 1999. No entanto, contagem inicia em 1.
  • (E) Correta: A explicação detalhada é a seguinte:
    1. contagem é inicializado com 1. saida é inicializado com 1.
    2. A main thread inicia a thread b.
    3. b.join(0) faz a main thread esperar até que a thread b termine completamente.
    4. A thread b executa o laço 1000 vezes. Em cada iteração, saida = contagem.getAndIncrement();.
      • getAndIncrement() retorna o valor atual de contagem e depois o incrementa.
      • Após 1000 iterações de b:
        • contagem (que começou em 1) terá sido incrementado 1000 vezes, resultando em 1 + 1000 = 1001.
        • saida terá recebido o valor de contagem antes do último incremento de b. O primeiro getAndIncrement() retorna 1, o segundo 2, ..., o milésimo retorna 1000. Então, saida será 1000.
    5. Após b terminar, a main thread inicia a thread c.
    6. c.join(0) faz a main thread esperar até que a thread c termine completamente.
    7. A thread c executa o laço 1000 vezes. Neste ponto, contagem é 1001 e saida é 1000.
      • Após 1000 iterações de c:
        • contagem (que começou em 1001 para c) terá sido incrementado 1000 vezes, resultando em 1001 + 1000 = 2001.
        • saida terá recebido o valor de contagem antes do último incremento de c. O primeiro getAndIncrement() de c retorna 1001, o segundo 1002, ..., o milésimo retorna 2000. Então, saida será 2000.
    8. Finalmente, a main thread imprime os valores finais: a.contagem (2001) e a.saida (2000).

Fonte: FGV CVM 2024 Analista CVM - TI Sistemas e Desenvolvimento (Perfil 8) (Caderno Tipo 1). Reproduzida para fins de estudo.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho