Implement a Thread-Safe Singleton in Java

Read the full interview experience this question came from →

Quick Overview

Explain the Singleton pattern and a safely published Java implementation. Separate one-time construction from concurrent state safety, and discuss lazy initialization, atomic operations, volatile, and the effect of shared instances on testing.

Implement a Thread-Safe Singleton in Java

Company: CVS Health

Role: Software Engineer

Category: Software Engineering Fundamentals

Difficulty: easy

Interview Round: Technical Screen

Explain the Singleton pattern and show how to implement a thread-safe singleton in Java. Then explain how you would ensure thread safety for operations on the shared instance. ### Constraints & Assumptions - Distinguish creation of one instance from safe concurrent use of its mutable state. - State whether initialization must be lazy. - A singleton is scoped to the relevant class-loading context; do not assume one global instance across separate application processes. ### Clarifying Questions to Ask - Does construction have side effects or failure modes that affect the initialization choice? - Can the service be immutable, or does it maintain shared mutable state? - Is a globally accessed instance necessary, or could one managed instance be passed through dependency injection? ### Part 1 — Define and Construct the Singleton Explain the pattern and give a Java implementation with safe publication. #### What This Part Should Cover - Controlled construction and a shared access path. - A synchronization or initialization guarantee that prevents competing creation. - The difference between eager and lazy initialization. ### Part 2 — Protect Shared Behavior Explain how reads and updates of the singleton's state remain correct under concurrency. #### What This Part Should Cover - State invariants and the required atomic operations. - Immutability, synchronization, or concurrent data structures where appropriate. - Why visibility alone does not make a compound update atomic. ```hint Even a safely published singleton can contain an unsafe counter or a check-then-act race. ``` ### What a Strong Answer Covers Provide a concrete construction strategy and identify the guarantee it uses. Then separately analyze the object's operations, avoiding the claim that a single instance is automatically thread-safe or that volatile makes every operation atomic. ### Follow-up Questions - What is wrong with unsynchronized lazy initialization? - What would double-checked locking require in Java? - How does a singleton affect test isolation?

Overview: Explain the Singleton pattern and a safely published Java implementation. Separate one-time construction from concurrent state safety, and discuss lazy initialization, atomic operations, volatile, and the effect of shared instances on testing.

Read the full CVS Health Software Engineer interview experience this question came from

CVS Health logo
CVS Health
Jul 25, 2026
easySoftware EngineerTechnical ScreenSoftware Engineering Fundamentals
0
0

Explain the Singleton pattern and show how to implement a thread-safe singleton in Java. Then explain how you would ensure thread safety for operations on the shared instance.

Constraints & Assumptions

  • Distinguish creation of one instance from safe concurrent use of its mutable state.
  • State whether initialization must be lazy.
  • A singleton is scoped to the relevant class-loading context; do not assume one global instance across separate application processes.

Clarifying Questions to Ask Guidance

  • Does construction have side effects or failure modes that affect the initialization choice?
  • Can the service be immutable, or does it maintain shared mutable state?
  • Is a globally accessed instance necessary, or could one managed instance be passed through dependency injection?

Part 1 — Define and Construct the Singleton

Explain the pattern and give a Java implementation with safe publication.

What This Part Should Cover Guidance

  • Controlled construction and a shared access path.
  • A synchronization or initialization guarantee that prevents competing creation.
  • The difference between eager and lazy initialization.

Part 2 — Protect Shared Behavior

Explain how reads and updates of the singleton's state remain correct under concurrency.

What This Part Should Cover Guidance

  • State invariants and the required atomic operations.
  • Immutability, synchronization, or concurrent data structures where appropriate.
  • Why visibility alone does not make a compound update atomic.

What a Strong Answer Covers Guidance

Provide a concrete construction strategy and identify the guarantee it uses. Then separately analyze the object's operations, avoiding the claim that a single instance is automatically thread-safe or that volatile makes every operation atomic.

Follow-up Questions Guidance

  • What is wrong with unsynchronized lazy initialization?
  • What would double-checked locking require in Java?
  • How does a singleton affect test isolation?