Rumah >pembangunan bahagian belakang >C++ >Adakah Benang Pembina Statik C# Selamat untuk Pelaksanaan Singleton?

Adakah Benang Pembina Statik C# Selamat untuk Pelaksanaan Singleton?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-16 11:31:59245semak imbas

Is C#'s Static Constructor Thread-Safe for Singleton Implementations?

Adakah C# pembina statik selamat untuk benang?

Pertimbangkan pelaksanaan tunggal berikut:

<code class="language-csharp">public class Singleton
{
    private static Singleton instance;

    private Singleton() { }

    static Singleton()
    {
        instance = new Singleton();
    }

    public static Singleton Instance
    {
        get { return instance; }
    }
}</code>

Adakah urutan pelaksanaan ini selamat?

Jawapan:

Pembina statik (seperti yang ditunjukkan dalam contoh) dijamin akan dijalankan sekali sahaja dalam domain aplikasi, sebelum sebarang contoh kelas dibuat atau sebelum ahli statik diakses (https://www.php .cn /link/362c6840e40a65edd557a108c219f8f0).

Oleh itu, pembinaan awal instance tunggal adalah selamat untuk benang, bermakna ia tidak memerlukan penguncian atau ujian batal. Walau bagaimanapun, ini tidak menjamin bahawa objek tunggal boleh digunakan secara segerak.

Untuk mencapai penyegerakan sebarang penggunaan contoh tunggal, beberapa kaedah boleh digunakan. Satu kaedah kelihatan seperti ini:

<code class="language-csharp">public class Singleton
{
    private static Singleton instance;
    // 添加静态互斥体以同步实例的使用。
    private static System.Threading.Mutex mutex;
    private Singleton() { }
    static Singleton()
    {
        instance = new Singleton();
        mutex = new System.Threading.Mutex();
    }

    public static Singleton Acquire()
    {
        mutex.WaitOne();
        return instance;
    }

    // 每次调用Acquire()都需要调用Release()
    public static void Release()
    {
        mutex.ReleaseMutex();
    }
}</code>

Pelaksanaan ini memperkenalkan mutex statik untuk menyegerakkan akses kepada kejadian tunggal. Untuk memastikan penyegerakan yang betul, pemerolehan setiap tika (Acquire()) mesti dikeluarkan (Release()).

Atas ialah kandungan terperinci Adakah Benang Pembina Statik C# Selamat untuk Pelaksanaan Singleton?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn