Exemplo de Singleton
Código
// prograrm da aplicacao usando multithread
class Program
{
static void Main(string[] args)
{
// The client code.
Console.WriteLine(
"{0}\n{1}\n\n{2}\n",
"If you see the same value, then singleton was reused (yay!)",
"If you see different values, then 2 singletons were created (booo!!)",
"RESULT:"
);
Thread process1 = new Thread(() =>
{
TestSingleton("FOO");
});
Thread process2 = new Thread(() =>
{
TestSingleton("BAR");
});
process1.Start();
process2.Start();
process1.Join();
process2.Join();
}
public static void TestSingleton(string value)
{
Singleton singleton = Singleton.GetInstance(value);
Console.WriteLine(singleton.Value);
}
}
// classe singleton capaz de avaliar se ja existe uma instancia criada para retornar sempre a mesma
class Singleton
{
private Singleton() { } // construtor privado
private static Singleton _instance; // objeto static que sera retornado
private static readonly object _lock = new object(); // lock para sincronizar threads em paralelo
// metodo responsavel pelo retorno do objeto assegurando que so teremos um caso sempre
public static Singleton GetInstance(string value)
{
if (_instance == null)
{
lock (_lock) // essa trava garante que a primeira thread vai criar o obj e as outras vao esperar o lock
{
if (_instance == null) // segundo check no obj porque as outras threads ficaram esperando a primeira terminar
{
_instance = new Singleton();
_instance.Value = value;
}
}
}
return _instance;
}
public string Value { get; set; }
}