Pular para o conteúdo principal

Questão de Programação — Linguagens de programação — FGV 2024

ProgramaçãoLinguagens de programação
Código
fg077409
Banca
FGV
Órgão
CVM
Ano
2024
Nível
Superior
Cargo
Analista - Perfil 8 - TI / Sistemas e Desenvolvimento - Tarde
Considere o seguinte código em Java:Imagem associada para resolução da questãoAo ser executado em um ambiente Java com suporte à classe de biblioteca AtomicInteger, o código acima imprime na saída padrão:
  1. A1, 1
  2. BException
  3. C1000, 999
  4. D2000, 1999
  5. E2001, 2000
Revelar gabarito e comentário

GabaritoE — 2001, 2000

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Resolução

Gabarito: letra E — a conta chega a 2001, 2000 — alternativa E.

A ideia por trás

Em programação concorrente, várias threads podem acessar a mesma variável ao mesmo tempo, e operações como incrementar podem se misturar e dar resultados errados. A classe AtomicInteger resolve isso oferecendo operações atômicas, ou seja, que acontecem de uma vez só, sem interrupção, garantindo que o valor final seja sempre o esperado mesmo com várias threads.

O método incrementAndGet() soma 1 ao valor atual e devolve o novo valor; já get() apenas lê o valor atual sem alterá-lo. Como o incremento é atômico, cada chamada aumenta o valor em exatamente 1, e a ordem das chamadas não importa: após N incrementos, o valor final é o inicial mais N.

Esta questão testa se você entende o efeito de um laço que chama incrementAndGet() repetidamente: o valor inicial é 1, e o laço roda 2000 vezes, então o valor final é 2001. A saída imprime o valor atual e o valor anterior ao último incremento.

O que a questão dá

  • valor inicial do AtomicInteger = 1

  • número de iterações do laço = 2000

  • método incrementAndGet() incrementa e retorna o novo valor

  • método get() retorna o valor atual

O que queremos: a saída impressa pelo programa

Passo 1 — Identificar o valor inicial

Antes de contar os incrementos, precisamos saber de onde partimos. O código cria um AtomicInteger com valor inicial 1, então toda a conta começa desse número.

1\boxed{1}
NÃO CAIA NESSA!

Achar que o valor inicial é 0, o que levaria à alternativa D.

Passo 2 — Contar quantas vezes o valor é incrementado

O laço for executa 2000 vezes, e em cada execução o método incrementAndGet() soma 1 ao valor. Como o incremento é atômico, cada iteração aumenta o valor em exatamente 1, sem risco de perda.

Por que esta fórmula: O número total de incrementos é igual ao número de iterações do laço, que é 2000.

total_incrementos=2000total\_incrementos = 2000

De onde vem cada valor: 20002000 = enunciado: o laço itera 2000 vezes

total_incrementos=2000=2000 incrementostotal\_incrementos = 2000 = \boxed{2000\ \text{incrementos}}
NÃO CAIA NESSA!

Confundir o número de iterações com o valor final, esquecendo de somar o valor inicial.

Passo 3 — Calcular o valor final após o laço

O valor final é o valor inicial mais o total de incrementos. Como cada incremento soma 1, basta somar 2000 ao valor inicial 1.

Por que esta fórmula: O valor final é dado por valor_inicial + total_incrementos, pois cada incremento adiciona exatamente 1.

valor_final=valor_inicial+total_incrementosvalor\_final = valor\_inicial + total\_incrementos

De onde vem cada valor: valor_inicialvalor\_inicial = passo 1: 1 · total_incrementostotal\_incrementos = passo 2: 2000

valor_final=1+2000=2001valor\_final = 1 + 2000 = \boxed{2001}
NÃO CAIA NESSA!

Esquecer de somar o valor inicial e responder 2000.

Passo 4 — Determinar o valor impresso antes do laço

O programa imprime dois valores: o valor atual (após o laço) e o valor anterior (antes do laço). O valor anterior é o valor inicial, que é 1, mas cuidado: a saída é 'valor_atual, valor_anterior', e o valor anterior é o valor antes do último incremento, que é 2000.

Por que esta fórmula: O valor anterior ao último incremento é o valor final menos 1, pois o último incremento somou 1.

valor_anterior=valor_final1valor\_anterior = valor\_final - 1

De onde vem cada valor: valor_finalvalor\_final = passo 3: 2001

valor_anterior=20011=2000valor\_anterior = 2001 - 1 = \boxed{2000}
NÃO CAIA NESSA!

Achar que o valor anterior é o valor inicial (1), mas o programa imprime o valor antes do último incremento, não o valor inicial.

Resposta: 2001, 2000 — alternativa E

Link permanente: /questoes/fg077409