Questão de Programação — Linguagens de programação — FGV 2024
Programação›Linguagens 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:Ao ser executado em um ambiente Java com suporte à classe de biblioteca AtomicInteger, o código acima imprime na saída padrão:
A1, 1
BException
C1000, 999
D2000, 1999
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.
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.
De onde vem cada valor: = enunciado: o laço itera 2000 vezes
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.
De onde vem cada valor: = passo 1: 1 · = passo 2: 2000
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.
De onde vem cada valor: = passo 3: 2001
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.