Singleton (Thread Safe)
private static readonly Lazy<DbConnectionThreadSafe> _instance = null!;
Using Lazy<T>
Because
- Thread safe by default
- Provides lazy initialization
static DbConnectionThreadSafe() { _instance = new Lazy<DbConnectionThreadSafe>( () => new DbConnectionThreadSafe(_connectionString), LazyThreadSafetyMode.ExecutionAndPublication ); }
Let's break down this static constructor and the Lazy initialization:
static DbConnection() // This is a static constructor { _lazyInstance = new Lazy<DbConnection>( () => new DbConnection(_connectionString), // Lambda expression LazyThreadSafetyMode.ExecutionAndPublication // Thread safety mode ); }
Let's examine each part:
-
Static Constructor (
static DbConnection()
)- A static constructor is called automatically before any static members are referenced
- It runs only once per app domain
- It's thread-safe by default (CLR guarantees this)
- Used to initialize static fields
-
Lazy
-
Lazy<T>
is a class that provides lazy initialization - The actual object isn't created until it's first accessed
- When you access
Lazy<T>.Value
for the first time, it creates the instance
-
-
Lambda Expression (
() => new DbConnection(_connectionString)
)- This is a factory function that creates the DbConnection instance
- It's only executed when the Lazy.Value is first accessed
- The
=>
syntax defines a lambda expression (anonymous function)
-
LazyThreadSafetyMode.ExecutionAndPublication
- This enum value specifies how the Lazy instance handles thread safety
- Three possible modes:
// No thread safety LazyThreadSafetyMode.None // Locks initialization LazyThreadSafetyMode.ExecutionAndPublication // Multiple threads can attempt initialization LazyThreadSafetyMode.PublicationOnly
The execution flow:
- When the class is first referenced, the static constructor runs
- The
_lazyInstance
is created, but the DbConnection instance is not yet created - When
Instance
is first accessed:- The lambda expression runs
- Creates new DbConnection with the connection string
- Stores it in the Lazy instance
- Subsequent accesses to
Instance
return the same stored instance
Top comments (0)