In C#, volatile affects access to a supported field; it does not make compound operations atomic or protect a larger shared-state invariant. Use lock when cooperating threads must take turns through a group of operations. For singleton creation, Lazy<T> or static initialization can provide safe initialization, but neither makes the created object’s mutable behavior thread-safe.
What does volatile mean in C#?
volatile is a modifier for certain fields in a class or struct. It is not valid on local variables, and it does not turn a field into a general-purpose synchronization mechanism. Microsoft’s guidance is direct: “For most multithreaded scenarios, even with supported types, prefer using Interlocked operations, lock statements, or other synchronization primitives instead of volatile.” Microsoft Learn: volatile (C# reference)
The modifier is supported for reference types, pointer types in unsafe contexts, selected simple types (sbyte, byte, short, ushort, int, uint, char, float, and bool), enums with supported integral base types, IntPtr, UIntPtr, and generic type parameters known to be reference types. C# does not allow volatile on long or double; use a suitable Interlocked operation or a lock when coordinating access to those values.
What it does not protect
A volatile field does not make counter++ atomic. Incrementing involves reading the current value, calculating a new value, and writing it back; another thread can intervene between those steps. Nor does volatile make a relationship between multiple fields safe. If correctness depends on a group of reads and writes staying consistent, protect the whole operation with a synchronization mechanism.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
#1 Best Overall
- Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
- Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
- Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
- Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
- 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.
When is a volatile stop flag appropriate?
A stop flag is a narrow example of the kind of field-level coordination for which volatile is often discussed. Microsoft’s reference illustrates one thread checking a Boolean flag while another requests that the worker stop:
public sealed class Worker
{
private volatile bool _shouldStop;
public void DoWork()
{
while (!_shouldStop)
{
// Do a unit of work.
}
}
public void RequestStop() => _shouldStop = true;
}
This example explains the pattern; it should not be read as a universal cancellation design. The reference cautions that on multiprocessor systems volatile reads are not guaranteed to obtain the latest value written by another processor, and volatile writes are not guaranteed to become immediately visible. For production cancellation, choose a higher-level cancellation primitive that fits the worker’s lifecycle rather than assuming volatile guarantees immediate observation.
Rank #2
- 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
- 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
- Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
- 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
- What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.
When should I use volatile vs. lock?
Use volatile only when you have a narrow, understood need involving a supported field. Use lock when an operation or invariant must be protected as a unit. A lock lets only one cooperating thread at a time enter the protected section, and it is released when control exits that section. Microsoft Learn: Synchronizing Data for Multithreading
| Approach | What it protects | Compound operations | What remains your responsibility |
|---|---|---|---|
volatile |
Access to a supported field | Does not make operations such as increment atomic or protect a multi-field invariant | Choose broader synchronization if correctness spans operations or fields |
lock |
A critical section shared by threads that use the same lock | Can serialize the complete operation or invariant placed inside the section | Keep the lock private and stable, and ensure all relevant access follows the same locking discipline |
Protect the whole operation with a lock
For example, place the increment itself inside the critical section:
Rank #3
- Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
- Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
- Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
- Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
- What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.
private readonly object _gate = new();
private int _count;
public void Increment()
{
lock (_gate)
{
_count++;
}
}
Keep the lock object private and stable. Do not lock on this, a public object, or a string literal: unrelated code could acquire the same monitor and interfere. In .NET 9 with C# 13 or later, a lock targeting a dedicated System.Threading.Lock uses Lock.EnterScope(); older code commonly uses a private reference-type lock object.
How do I make a thread-safe singleton in C#?
For a hand-coded singleton, select an initialization pattern based on when the value should be created. Lazy<T> initializes on first access; static initialization is managed by the runtime as part of type initialization. Both approaches address construction, not the thread safety of the singleton’s later operations.
Rank #4
- Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
- Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
- Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
- Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
- Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft
Lazy creation with Lazy<T>
public sealed class ExampleSingleton
{
private static readonly Lazy<ExampleSingleton> InstanceHolder =
new(() => new ExampleSingleton());
private ExampleSingleton() { }
public static ExampleSingleton Instance => InstanceHolder.Value;
}
The default Lazy<T> constructors provide thread-safe initialization: the first access creates the value, and subsequent accesses return that value. With a factory-based lazy initializer, an initialization exception can also be cached. These guarantees apply to creating and retrieving the instance; if its methods or mutable state are used by multiple threads, design synchronization for those operations separately. Microsoft Learn: Lazy<T> Class
Creation during static initialization
A static field or property initialized as part of type initialization is another common singleton construction pattern. The runtime manages static initialization; that guarantee does not mean arbitrary instance methods are safe for concurrent use. Microsoft Learn: Static Constructors (C#)
Recommended Free Tools
Best Value
- 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
- Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
- Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
- HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
- What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.
Singleton services in dependency-injection applications
A container-managed singleton service lifetime is not the same as implementing the singleton design pattern directly. Microsoft’s .NET dependency-injection guidance says singleton services must be thread-safe and advises against implementing the singleton pattern and providing code to dispose of the singleton. Follow the container’s lifecycle guidance for the application instead of adding a hand-coded global singleton by default. Microsoft Learn: Dependency injection guidelines – .NET
Quick Recap
Which synchronization approach should you choose?
- Choose
volatileonly for a supported field when its limited semantics are sufficient and understood. - Choose
lockwhen multiple reads and writes must be treated as one protected operation. - Choose
Interlockedfor supported atomic operations when a lock is not the right coordination mechanism. - Choose
Lazy<T>or static initialization to address singleton construction, then separately decide how shared mutable behavior will be protected. - In dependency-injection applications, prefer the container’s singleton lifetime when that matches the service lifecycle, and make the service’s operations thread-safe.
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

