Questão nº 53
Questão de Desenvolvimento de Sistemas · FGV CGU 2021 - Tarde (nº 53)
Considere o desenvolvimento de uma aplicação em um contexto de programação concorrente, em que é esperada a execução simultânea de múltiplas tarefas computacionais. O time utiliza a linguagem de programação JAVA e o framework ORM Hibernate no projeto. Para obter um objeto do tipo `SessionFactory`, o time decide utilizar o arquivo de configuração e as seguintes classes: `org.hibernate.cfg.Configuration`, `org.hibernate.service.ServiceRegistry` e `org.hibernate.service.ServiceRegistryBuilder`.
No início do desenvolvimento da primeira funcionalidade com linhas de execução paralelas (Threads), o time discute se é seguro compartilhar o objeto do tipo `SessionFactory`.
Um dos desenvolvedores afirma que é seguro.
O time concluiu acertadamente que esse desenvolvedor está:
- Aerrado, pois a classe `SessionFactoryImpl` implementa a interface `Referenceable`;
- Berrado, pois a classe `SessionFactoryImpl` não é thread-safe;
- Cerrado, pois a classe `SessionFactoryImplementor` não é thread-safe;
- Dcorreto, pois o objeto do tipo `SessionFactory` é imutável e seu estado interno contém os metadados ORM; (alternativa correta)
- Ecorreto, pois a classe `SessionFactoryImplementor` implementa a interface `ConcurrentHashMap`.
Resposta comentada
Gabarito Alternativa D
Conceito-chave: O SessionFactory é um objeto pesado e caro de criar, que representa todo o mapeamento objeto-relacional (ORM) da aplicação. Ele é thread-safe porque é imutável após a construção: seu estado interno (metadados, SQL gerado, dialeto) não muda, então múltiplas Threads podem ler e usar esse mesmo objeto simultaneamente sem risco de corrupção de dados. Já o Session (criado a partir dele) é leve, não é thread-safe e deve ser usado por uma única Thread por vez.
- (A) Incorreta: A interface
Referenceable(do pacotejavax.naming) serve para registro em serviços de nomes (JNDI), não tem relação com segurança em concorrência. - (B) Incorreta: A classe
SessionFactoryImplé, sim, thread-safe (por ser imutável), então afirmar que ela "não é thread-safe" é falso. - (C) Incorreta: A interface
SessionFactoryImplementor(usada internamente) também é thread-safe pelo mesmo motivo: imutabilidade e compartilhamento seguro de metadados. - (D) Correta: O
SessionFactoryé imutável e seu estado interno contém os metadados ORM (mapeamentos, configurações, SQL pré-compilado). Por ser imutável, é seguro compartilhá-lo entre múltiplasThreadssem sincronização explícita. - (E) Incorreta: A classe
SessionFactoryImplementornão implementaConcurrentHashMap; ela é uma interface do Hibernate, e a imutabilidade é o que garante a segurança, não uma coleção concorrente.
Armadilha da banca (distrator B): A pegadinha está em confundir SessionFactory com Session. O Session não é thread-safe e deve ser isolado por Thread. O candidato que lembra disso pode marcar "errado" para o SessionFactory por associação incorreta. A banca testa exatamente esse conhecimento: SessionFactory é imutável e seguro; Session é descartável e inseguro.
Fonte: FGV CGU 2021 - Tarde Auditor Federal de Finanças e Controle - Área Tecnologia da Informação (Caderno Tipo 1). Reproduzida para fins de estudo.