.NET單例模式快速學習應用

單例模式屬於設計模式中最簡單的一個模式,在實際應用中也很是普遍,但多是受到各種教程的影響,看到不少實現方式仍然沿用Java的那一套,其實在.NET中能夠用更簡潔的實現方式。設計模式

1、知識點介紹安全

核心目標:爲了項目各處調用的都是同一個實例對象,從而實現資源共享。例如環境變量。多線程

常見的實現方式:餓漢模式、懶漢模式、雙鎖模式ui

2、實現方式spa

/// <summary>
/// 餓漢模式,每次都加載會形成資源浪費
/// </summary>
public class EagerSingleton
{
    public static Demo Instance { get; } = new Demo();
}
/// <summary>
/// 懶漢模式,適用於沒有多線程的簡單應用
/// </summary>
public class LazySingleton
{
    private static Demo _instance = null;
    public static Demo Instance
    {
        get
        {
            if (_instance == null)
                _instance = new Demo();
            return _instance;
        }
    }
}
/// <summary>
/// 線程安全
/// </summary>
public class ThreadSafeSingleton
{
    private static Demo _instance = null;
    private static readonly object _lock = new object();
    public static Demo Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (_lock)
                {
                    if (_instance == null)
                        _instance = new Demo();
                }
            }
            return _instance;
        }
    }
}

調用方式線程

static void Main(string[] args)
{
    ThreadPool.SetMaxThreads(25, 25);// 調整最大線程數
    ThreadPool.SetMinThreads(10, 10);// 調整最小線程數

    Console.WriteLine("========== 示例:餓漢模式的多線程 ==========");
    Parallel.For(0, 10, (i) =>
    {
        Console.WriteLine($"{EagerSingleton.Instance.Id} ");
    });

    Console.WriteLine();
    Console.WriteLine("========== 示例:懶漢模式的多線程 ==========");
    Parallel.For(0, 10, (i) =>
    {
        Console.WriteLine($"{LazySingleton.Instance.Id} ");
    });

    Console.WriteLine();
    Console.WriteLine("========== 示例:線程安全模式的多線程 ==========");
    Parallel.For(0, 10, (i) =>
    {
        Console.WriteLine($"{ThreadSafeSingleton.Instance.Id} ");
    });

    Console.ReadKey();
}

public class Demo
{
    public string Id { get; private set; }
    public Demo() { Id = Guid.NewGuid().ToString(); }
}

調用結果:設計

3、結論code

> 餓漢模式適用於規模不大又涉及多線程的應用,可是要關注單例的對象的資源佔用狀況。對象

> 懶漢模式適用於不須要多線程的應用,容易理解記住而且效果還不錯。blog

> 雙鎖模式就適用於比較規範化的應用,適用於有長遠規劃的系統。

> 單例模式不要實現 ICloneable 接口,不要涉及序列化,不然就會出現多個對象。

相關文章
相關標籤/搜索