首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 設計模式實戰:Singleton 單例模式完整解析(一)

     編輯:關於C語言

模式意圖

確保一個類別只有一個實例,並提供全域存取點。

應用場景:遊戲伺服器負載平衡

網路遊戲服務端需承載大量玩家,參考 Web 負載平衡概念:統一入口分配玩家至各伺服器。關鍵需求:多執行緒併發下,玩家只能透過唯一入口分配,由此引入 Singleton。

完整實作代碼

using System;
using System.Collections.Generic;
using System.Threading;

namespace SingletonExample
{
    class Program
    {
        static void Main(string[] args)
        {
            ParameterizedThreadStart ts = new ParameterizedThreadStart(EnterPlayer);
            for (int i = 0; i < 20; i++)
            {
                Thread t = new Thread(ts);
                t.Start("player" + i);
            }
            LoadBalanceServer.GetLoadBalanceServer().ShowServerInfo();
        }

        static void EnterPlayer(object playerName)
        {
            LoadBalanceServer lbs = LoadBalanceServer.GetLoadBalanceServer();
            lbs.GetLobbyServer().EnterPlayer(playerName.ToString());
        }
    }

    class LoadBalanceServer
    {
        private const int SERVER_COUNT = 3;
        private List<LobbyServer> _servers = new List<LobbyServer>();
        private static volatile LoadBalanceServer _instance;
        private static readonly object _lock = new object();

        private LoadBalanceServer()
        {
            for (int i = 0; i < SERVER_COUNT; i++)
                _servers.Add(new LobbyServer("LobbyServer" + i));
        }

        public static LoadBalanceServer GetLoadBalanceServer()
        {
            if (_instance == null)
            {
                lock (_lock)
                {
                    if (_instance == null)
                    {
                        Thread.Sleep(100); // 模擬建構延遲
                        _instance = new LoadBalanceServer();
                    }
                }
            }
            return _instance;
        }

        public LobbyServer GetLobbyServer()
        {
            LobbyServer least = _servers[0];
            for (int i = 1; i < SERVER_COUNT; i++)
                if (_servers[i].PlayerList.Count < least.PlayerList.Count)
                    least = _servers[i];
            return least;
        }

        public void ShowServerInfo()
        {
            foreach (var ls in _servers)
            {
                Console.WriteLine("=================" + ls.ServerName + "=================");
                foreach (var player in ls.PlayerList)
                    Console.WriteLine(player);
            }
        }
    }

    class LobbyServer
    {
        private List<string> _players = new List<string>();
        public List<string> PlayerList => _players;
        public string ServerName { get; }

        public LobbyServer(string name) => ServerName = name;

        public void EnterPlayer(string playerName) => _players.Add(playerName);
    }
}

關鍵實作細節

  • volatile 關鍵字防止指令重排序
  • 雙重檢查鎖定減少鎖競爭
  • 私有建構函式封裝初始化邏輯
  • 併發測試:20 條執行緒同時存取驗證單一實例
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved