using System;
using System.Collections.Generic;
class MainApp
{
static void Main()
{
LoadBalancer oldbalancer = null;
for (int i = 0; i < 15; i++)
{
LoadBalancer balancerNew = LoadBalancer.GetLoadBalancer();
if (oldbalancer == balancerNew && oldbalancer != null)
{
Console.WriteLine("{0} SameInstance {1}", oldbalancer.Server, balancerNew.Server);
}
oldbalancer = balancerNew;
}
Console.ReadKey();
}
}
class LoadBalancer
{
private static LoadBalancer _instance;
private List<string> _servers = new List<string>();
private Random _random = new Random();
private static object syncLock = new object();
private LoadBalancer()
{
_servers.Add("ServerI");
_servers.Add("ServerII");
_servers.Add("ServerIII");
_servers.Add("ServerIV");
_servers.Add("ServerV");
}
public static LoadBalancer GetLoadBalancer()
{
if (_instance == null)
{
lock (syncLock)
{
if (_instance == null)
{
_instance = new LoadBalancer();
}
}
}
return _instance;
}
public string Server
{
get
{
int r = _random.Next(_servers.Count);
return _servers[r].ToString();
}
}
}
Я взял код с dofactory.com , ничего особенного, но Я считаю, что это гораздо лучше, чем примеры с Foo и Bar дополнительно книга от Джудит Бишоп на C # 3.0 DesignВ шаблонах есть пример активного приложения в доке Mac.
Если вы посмотрите на код, мы фактически строим новые объекты в цикле для , так что создается новый объект, но повторно используется экземпляр, в результате чегоу oldbalancer и newbalancer есть один и тот же экземпляр, как?это происходит из-за статического ключевого слова, используемого в функции GetLoadBalancer () , несмотря на то, что сервер имеет другое значение, которое является случайным списком, статическое в GetLoadBalancer () относится к типусам по себе, а не к конкретному объекту.
Кроме того, здесь двойная проверка блокировки здесь
if (_instance == null)
{
lock (syncLock)
{
if (_instance == null)
с MSDN
Ключевое слово lock гарантирует, что один поток не входит в критический раздел кода, в то время как другой поток находится в критическом разделе.Если другой поток попытается ввести заблокированный код, он будет ожидать блокировки до тех пор, пока объект не будет освобожден.
, поэтому каждый раз выдается блокировка взаимного исключения, даже если он не 'нам не нужно ничего лишнего, поэтому у нас есть нулевая проверка.
Надеюсь, это поможет очистить больше.
И, пожалуйста, прокомментируйте, если я понимаю, что неверно.