31

I have the following C# singleton pattern, is there any way of improving it?

    public class Singleton<T> where T : class, new()
    {

        private static object _syncobj = new object();
        private static volatile T _instance = null;
        public static T Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (_syncobj)
                    {
                        if (_instance == null)
                        {
                            _instance = new T();
                        }
                    }
                }
                return _instance;
            }
        }

        public Singleton()
        { }

    }

Preferred usage example:

class Foo : Singleton<Foo> 
{
} 

Related:

An obvious singleton implementation for .NET?

Community
  • 1
  • 1
Sam Saffron
  • 128,308
  • 78
  • 326
  • 506
  • As it stands I had to add "protected" to the constructor in order to compile. – Kevin Driedger Jan 27 '09 at 18:35
  • The question is difficult to read. Does "Is this Generic Singleton class good? Is it thread safe?" still convey the correct meaning? – Greg Sep 24 '09 at 20:45
  • Feel free to do anything you see fit with this question, its community wiki – Sam Saffron Sep 24 '09 at 21:30
  • 1
    One caveat with any Singleton based on an Instance property is that you have to be careful if your class constructor has side effects. If you hover over the Instance property in the debugger while in the middle of singleton construction (because you set a breakpoint in one of the side effects, for example), you can actually execute the constructor again and cause all sorts of fun mind-boggling problems. This happens because the debugger (by default) evaluates properties automatically when you hover over them. – Dan Bryant Oct 25 '11 at 15:55

23 Answers23

18

According to Jon Skeet in Implementing the Singleton Pattern in C# the code you posted is actually considered as bad code, because it appears broken when checked against the ECMA CLI standard.

Also watch out: everytime you instantiate your object with a new type of T, it becomes another instance; it doesn't get reflected in your original singleton.

Moby Disk
  • 3,761
  • 1
  • 19
  • 38
Jon Limjap
  • 94,284
  • 15
  • 101
  • 152
10

This code won't compile, you need "class" constraint on T.

Also, this code requires public constructor on target class, which is not good for singleton, because you can't control at compile time that you obtain (single) instance only via Instance property (or field). If you don't have any other static members except Instance, you are ok to go with just this:

class Foo
{
  public static readonly Instance = new Foo();
  private Foo() {}
  static Foo() {}
}

It is thread safe (guaranteed by CLR) and lazy (instance is created with first access to type). For more discussion about BeforeFieldInit and why we need static constructor here, see https://csharpindepth.com/articles/BeforeFieldInit.

If you want to have other public static members on type, but create object only on access to Instance, you may create nested type, like in https://csharpindepth.com/articles/Singleton

Moby Disk
  • 3,761
  • 1
  • 19
  • 38
Ilya Ryzhenkov
  • 11,782
  • 1
  • 40
  • 50
  • 1
    You have the correct answer. This is the best implementation because it is the simplest, it's built into the language and you're not burning your base class to implement a trivial feature. – Wayne Bloss Nov 15 '08 at 05:55
  • @wizlb By moving common logic to base class you take the responsibility to ensure that pattern is used correctly from authors of derived classes to single base class. – Michael Freidgeim Apr 30 '13 at 21:42
8

Courtesy of Judith Bishop, http://patterns.cs.up.ac.za/

This singleton pattern implementation ensures lazy initialisation.

//  Singleton PatternJudith Bishop Nov 2007
//  Generic version

public class Singleton<T> where T : class, new()
{
    Singleton() { }

    class SingletonCreator
    {
        static SingletonCreator() { }
        // Private object instantiated with private constructor
        internal static readonly T instance = new T();
    }

    public static T UniqueInstance
    {
        get { return SingletonCreator.instance; }
    }
}
EggyBach
  • 4,148
  • 1
  • 18
  • 21
  • 3
    Im sorry, im no longer comfortable with this being correct, the problem is that you end up having a type that is both newable and can be accessed via the singleton ... – Sam Saffron Jun 18 '09 at 00:28
  • Just a quick question Sam: How did you manage to create a new instance of the class? According to the code above, the constructor is private... – EggyBach Jun 19 '09 at 09:36
  • 1
    This pattern is good, but there's one thing that bothers me : the new() type constraint implies that the singleton has a public constructor, which breaks the singleton pattern. I think this constraints should be removed, and Activator.CreateInstance should be used to call the protected constructor – Thomas Levesque Aug 24 '09 at 16:48
  • 3
    T must have a _public_ `new()` – Alexey Romanov Aug 24 '09 at 18:04
  • @Darksider, Singleton ... var d = new Dog() works just fine... which I would prefer did not. See: cade's answer. – Sam Saffron Aug 25 '09 at 02:25
5

This is my point using .NET 4

public class Singleton<T> where T : class, new()
    {
        Singleton (){}

        private static readonly Lazy<T> instance = new Lazy<T>(()=> new T());

        public static T Instance { get { return instance.Value; } } 
    }
Alexandr
  • 1,452
  • 2
  • 20
  • 42
  • 1
    The class is not a singleton, because the public constructor allows to create multiple instances . The class is useful, but I've renamed it to SingleInstanceBase – Michael Freidgeim Apr 30 '13 at 21:55
  • Please see question. This is the way of improving question class using .net 4 – Alexandr May 01 '13 at 11:05
3

I don't think that you really want to "burn your base class" so that you can save 2 lines of code. You don't really need a base class to implement singleton.

Whenever you need a singleton, just do this:

class MyConcreteClass
{
  #region Singleton Implementation

    public static readonly Instance = new MyConcreteClass();

    private MyConcreteClass(){}

  #endregion

    /// ...
}
Wayne Bloss
  • 5,370
  • 7
  • 50
  • 81
3

More details on this answer on a different thread : How to implement a singleton in C#?

However the thread doesn't use generic.

Community
  • 1
  • 1
Binoj Antony
  • 15,886
  • 25
  • 88
  • 96
2
public sealed class Singleton
{
   private static readonly Singleton instance = new Singleton();

   private Singleton(){}

   public static Singleton Instance
   {
      get 
      {
         return instance; 
      }
   }
}

There's no ambiguity in .NET around initialization order; but this raises threading issues.

blowdart
  • 55,577
  • 12
  • 114
  • 149
  • This is really not an improvement, for one its not using generics so you have to cast Instance when you subclass, its also potentially initializing the object before you really need it. – Sam Saffron Sep 19 '08 at 06:56
  • 2
    Actually it's not initializing before you need it; read the MSDN link provided; "the instance is created the first time any member of the class is referenced". – blowdart Sep 19 '08 at 07:58
2

:/ The generic "singleton" pattern by Judith Bishop seems kinda flawed, its always possible to create several instances of type T as the constructor must be public to use it in this "pattern". In my opinion it has absolutely nothing to do with singleton, its just a kind of factory, which always returns the same object, but doesn't make it singleton... as long as there can be more than one instance of a class it can't be a singleton. Any reason this pattern is top-rated?

public sealed class Singleton
{
  private static readonly Singleton _instance = new Singleton();

  private Singleton()
  {
  }

  public static Singleton Instance
  {
    get
    {
      return _instance;
    }
  }
}

Static initializers are considered thread-safe.. I don't know but you shouldn't use idioms of singleton at all, if you wrap my code above its not more than 3 lines... and inheriting from a singleton doesn't make any sense either.

live627
  • 397
  • 4
  • 18
haze4real
  • 728
  • 1
  • 9
  • 19
1

As requested, cross posting from my original answer to another question.

My version uses Reflection, works with non-public constructors in the derived class, is threadsafe (obviously) with lazy instantiation (according to the article I found linked below):

public class SingletonBase<T> where T : class
{
    static SingletonBase()
    {
    }

    public static readonly T Instance = 
        typeof(T).InvokeMember(typeof(T).Name, 
                                BindingFlags.CreateInstance | 
                                BindingFlags.Instance |
                                BindingFlags.Public |
                                BindingFlags.NonPublic, 
                                null, null, null) as T;
}

I picked this up a few years ago, not sure how much is mine, but googling on the code might find the original source of the technique if it wasn't me.

This is the oldest source of the code that I can find that was not me posting it.

Cade Roux
  • 88,164
  • 40
  • 182
  • 265
1

Try this generic Singleton class implementing the Singleton design pattern in a thread safe and lazy way (thx to wcell).

public abstract class Singleton<T> where T : class
{
    /// <summary>
    /// Returns the singleton instance.
    /// </summary>
    public static T Instance
    {
        get
        {
            return SingletonAllocator.instance;
        }
    }

    internal static class SingletonAllocator
    {
        internal static T instance;

        static SingletonAllocator()
        {
            CreateInstance(typeof(T));
        }

        public static T CreateInstance(Type type)
        {
            ConstructorInfo[] ctorsPublic = type.GetConstructors(
                BindingFlags.Instance | BindingFlags.Public);

            if (ctorsPublic.Length > 0)
                throw new Exception(
                    type.FullName + " has one or more public constructors so the property cannot be enforced.");

            ConstructorInfo ctorNonPublic = type.GetConstructor(
                BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[0], new ParameterModifier[0]);

            if (ctorNonPublic == null)
            {
                throw new Exception(
                    type.FullName + " doesn't have a private/protected constructor so the property cannot be enforced.");
            }

            try
            {
                return instance = (T)ctorNonPublic.Invoke(new object[0]);
            }
            catch (Exception e)
            {
                throw new Exception(
                    "The Singleton couldnt be constructed, check if " + type.FullName + " has a default constructor", e);
            }
        }
    }
}
w0land
  • 141
  • 1
  • 4
1

The Double-Check Locking [Lea99] idiom provided by Microsoft here is amazingly similar to your provided code, unfortunately, this fails the ECMA CLI standard for a puritan view of thread-safe code and may not work correctly in all situations.

In a multi-threaded program, different threads could try to instantiate a class simultaneously. For this reason, a Singleton implementation that relies on an if statement to check whether the instance is null will not be thread-safe. Don't write code like that!

A simple, yet effective means of creating a thread-safe singleton is to use a nested class to instantiate it. The following is an example of a lazy instantiation singleton:

public sealed class Singleton
{ 
   private Singleton() { }

   public static Singleton Instance
   {
      get
      {
         return SingletonCreator.instance;
      }
   }

   private class SingletonCreator
   {
      static SingletonCreator() { }
      internal static readonly Singleton instance = new Singleton();
   }
}

Usage:

Singleton s1 = Singleton.Instance;
Singleton s2 = Singleton.Instance;
if (s1.Equals(s2))
{
    Console.WriteLine("Thread-Safe Singleton objects are the same");
}

Generic Solution:

public class Singleton<T>
    where T : class, new()
{
    private Singleton() { }

    public static T Instance 
    { 
        get 
        { 
            return SingletonCreator.instance; 
        } 
    } 

    private class SingletonCreator 
    {
        static SingletonCreator() { }

        internal static readonly T instance = new T();
    }
}

Usage:

class TestClass { }

Singleton s1 = Singleton<TestClass>.Instance;
Singleton s2 = Singleton<TestClass>.Instance;
if (s1.Equals(s2))
{
    Console.WriteLine("Thread-Safe Generic Singleton objects are the same");
}

Lastly, here is a somewhat releated and usefull suggestion - to help avoid deadlocks that can be caused by using the lock keyword, consider adding the following attribute to help protect code in only public static methods:

using System.Runtime.CompilerServices;
[MethodImpl (MethodImplOptions.Synchronized)]
public static void MySynchronizedMethod()
{
}

References:

  1. C# Cookbook (O'Reilly), Jay Hilyard & Stephen Teilhet
  2. C# 3.0 Design Patterns (O'Reilly), Judith Bishop
  3. CSharp-Online.Net - Singleton design pattern: Thread-safe Singleton
Rick
  • 325
  • 1
  • 7
1

I was looking for a better Singleton pattern and liked this one. So ported it to VB.NET, can be useful for others:

Public MustInherit Class Singleton(Of T As {Class, New})
    Public Sub New()
    End Sub

    Private Class SingletonCreator
        Shared Sub New()
        End Sub
        Friend Shared ReadOnly Instance As New T
    End Class

    Public Shared ReadOnly Property Instance() As T
        Get
            Return SingletonCreator.Instance
        End Get
    End Property
End Class
dr. evil
  • 26,944
  • 33
  • 131
  • 201
0

I quite liked your original answer - the only thing missing (according to the link posted by blowdart) is to make the _instance variable volatile, to make sure it has actually been set in the lock. I actually use blowdarts solution when I have to use a singleton, but I dont have any need to late-instantiate etc.

Wyzfen
  • 363
  • 3
  • 9
0

As in wikipedia:

the singleton pattern is a design pattern that restricts the instantiation of a class to one object

I beleave that there is no guaranteed way to do it using generics, if you have restricted the instantiation of the singleton itself, how to restrict the instantiation of the main class, I think it is not possible to do that, and implementing this simple pattern is not that hard, take this way using the static constructor and private set:

public class MyClass
{
        private MyClass()
        {

        }

        static MyClass()
        {
            Instance = new MyClass();
        }

        public static MyClass Instance { get; private set; }
}

OR:

public class MyClass
    {
            private MyClass()
            {

            }

            static MyClass()
            {
                Instance = new MyClass();
            }

            private static MyClass instance;



            public static MyClass Instance
            {
                get
                {
                    return instance;
                }
                private set
                {
                    instance = value;
                }
            }
    }
Saw
  • 6,199
  • 11
  • 53
  • 104
0
public static class LazyGlobal<T> where T : new()
{
    public static T Instance
    {
        get { return TType.Instance; }
    }

    private static class TType
    {
        public static readonly T Instance = new T();
    }
}

// user code:
{
    LazyGlobal<Foo>.Instance.Bar();
}

Or:

public delegate T Func<T>();

public static class CustomGlobalActivator<T>
{
    public static Func<T> CreateInstance { get; set; }
}

public static class LazyGlobal<T>
{
    public static T Instance
    {
        get { return TType.Instance; }
    }

    private static class TType
    {
        public static readonly T Instance = CustomGlobalActivator<T>.CreateInstance();
    }
}

{
    // setup code:
    // CustomGlobalActivator<Foo>.CreateInstance = () => new Foo(instanceOf_SL_or_IoC.DoSomeMagicReturning<FooDependencies>());
    CustomGlobalActivator<Foo>.CreateInstance = () => instanceOf_SL_or_IoC.PleaseResolve<Foo>();
    // ...
    // user code:
    LazyGlobal<Foo>.Instance.Bar();
}
uvw
  • 91
  • 2
0

Saw one a while ago which uses reflection to access a private (or public) default constructor:

public static class Singleton<T>
{
    private static object lockVar = new object();
    private static bool made;
    private static T _singleton = default(T);

    /// <summary>
    /// Get The Singleton
    /// </summary>
    public static T Get
    {
        get
        {
            if (!made)
            {
                lock (lockVar)
                {
                    if (!made)
                    {
                        ConstructorInfo cInfo = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[0], null);
                        if (cInfo != null)
                            _singleton = (T)cInfo.Invoke(new object[0]);
                        else
                            throw new ArgumentException("Type Does Not Have A Default Constructor.");
                        made = true;
                    }
                }
            }

            return _singleton;
        }
    }
}
JDunkerley
  • 12,355
  • 5
  • 41
  • 45
0

This works for me:

public static class Singleton<T> 
{
    private static readonly object Sync = new object();

    public static T GetSingleton(ref T singletonMember, Func<T> initializer)
    {
        if (singletonMember == null)
        {
            lock (Sync)
            {
                if (singletonMember == null)
                    singletonMember = initializer();
            }
        }
        return singletonMember;
    }
}

Usage:

private static MyType _current;
public static MyType Current = Singleton<MyType>.GetSingleton(ref _current, () => new MyType());

Consume the singleton:

MyType.Current. ...
MaurGi
  • 1,698
  • 2
  • 18
  • 28
0

No Matter which exmaple you choose, always check for concurrency using Parallel.For! ( loop in which iterations may run in parallel)

put in Singleton C'tor :

 private Singleton ()
        {
            Console.WriteLine("usage of the Singleton for the first time");
        }

put in Main :

Parallel.For(0, 10,
              index => {
                  Thread tt = new Thread(new ThreadStart(Singleton.Instance.SomePrintMethod));
                  tt.Start();
              });
Eran Peled
  • 767
  • 6
  • 6
0

In many solutions today, people use service lifetime of singleton with dependency injection, as .NET offers this out of the box. If you still want to create a generic singleton pattern in your code where you might also consider initializing the type T to a initialized singleton object, 'settable once' and thread safe, here is a possible way to do it.

  public sealed class Singleton<T> where T : class, new()
    {
        private static Lazy<T> InstanceProxy
        {
            get
            {
                if (_instanceObj?.IsValueCreated != true)
                {
                    _instanceObj = new Lazy<T>(() => new T());
                }
                return _instanceObj;
            }
        }

        private static Lazy<T>? _instanceObj;


        public static T Instance { get { return InstanceProxy.Value; } } 

        public static void Init(Lazy<T> instance)
        {
            if (_instanceObj?.IsValueCreated == true)
            {
                throw new ArgumentException($"A Singleton for the type <T> is already set"); 
            }
            _instanceObj = instance ?? throw new ArgumentNullException(nameof(instance)); 
        }

        private Singleton()
        {   
        }
    }

The class is sealed and with a private constructor, it accepts types which are classes and must offer a public parameterless constructor 'new'. It uses the Lazy to achieve built in thread safety. You can init also the type T Singleton object for convenience. It is only allowed if a Singleton is not first set. Obviously, you should only init a Singleton of type T early on in your program, such as when the application or service / API starts up. The code will throw an ArgumentException if the Init method is called twice or more times for the type T.

You can use it like this : Some model class :

public class Aeroplane
{
    public string? Model { get; set; }
    public string? Manufacturer { get; set; }
    public int YearBuilt { get; set; }
    public int PassengerCount { get; set; }
}

Usage sample :

var aeroplane = new Aeroplane
{
    Manufacturer = "Boeing",
    Model = "747",
    PassengerCount = 350,
    YearBuilt = 2005
};

var aeroPlane3 = Singleton<Aeroplane>.Instance;
var aeroPlane4 = Singleton<Aeroplane>.Instance;

Console.WriteLine($"Aeroplane3 and aeroplane4 is same object? {Object.ReferenceEquals(aeroPlane3, aeroPlane4)}");

Outputs 'true'.

Trying to re-init type T Singleton to another object fails :

var aeroplane2 = new Aeroplane
{
    Manufacturer = "Sopwith Aviation Company",
    Model = "Sophwith Camel",
    PassengerCount = 1,
    YearBuilt = 1917
};

Singleton<Aeroplane>.Init(new Lazy<Aeroplane>(aeroplane2));

You can of course just access the Singleton with initing it - it will call the default public constructor. Possible you could have a way of setting a custom constructor here instead of passing an object as a sort of 'factory pattern'.

var aeroplaneDefaultInstantiated = Singleton<Aeroplane>.Instance; 

Default instantiation - calls the parameterless public constructor of type T.

Tore Aurstad
  • 3,189
  • 1
  • 27
  • 22
0

I submit this to the group. It seems to be thread-safe, generic and follows the pattern. You can inherit from it. This is cobbled together from what others have said.

public class Singleton<T> where T : class
{
    class SingletonCreator
    {
        static SingletonCreator() { }

        internal static readonly T Instance =
            typeof(T).InvokeMember(typeof(T).Name,
                                    BindingFlags.CreateInstance |
                                    BindingFlags.Instance |
                                    BindingFlags.Public |
                                    BindingFlags.NonPublic,
                                    null, null, null) as T;
    }

    public static T Instance
    {
        get { return SingletonCreator.Instance; }
    }
}

Intended implementation:

public class Foo: Singleton<Foo>
{
     private Foo() { }
}

Then:

Foo.Instance.SomeMethod();
101010
  • 14,866
  • 30
  • 95
  • 172
0

My contribution for ensuring on demand creation of instance data:


/// <summary>Abstract base class for thread-safe singleton objects</summary>
/// <typeparam name="T">Instance type</typeparam>
public abstract class SingletonOnDemand<T> {
    private static object __SYNC = new object();
    private static volatile bool _IsInstanceCreated = false;
    private static T _Instance = default(T);

/// <summary>Instance data</summary> public static T Instance { get { if (!_IsInstanceCreated) lock (__SYNC) if (!_IsInstanceCreated) _Instance = Activator.CreateInstance<T>(); return _Instance; } } }
0

pff... again... :)
My contribution for ensuring on demand creation of instance data:


/// <summary>Abstract base class for thread-safe singleton objects</summary>
/// <typeparam name="T">Instance type</typeparam>
public abstract class SingletonOnDemand<T> {
  private static object __SYNC = new object();
  private static volatile bool _IsInstanceCreated = false;
  private static T _Instance = default(T);

  /// <summary>Instance data</summary>
  public static T Instance {
    get {
      if (!_IsInstanceCreated)
        lock (__SYNC)
          if (!_IsInstanceCreated) {
            _Instance = Activator.CreateInstance<T>();
            _IsInstanceCreated = true;
          }
          return _Instance;
    }
  }
}
  • If you replace '= default(T)' with '= new T()' then you don't have to do the double-check locking and just 'get { return _Instance; }' – Steven Evers Jul 11 '10 at 22:40
-8

You don't need all that, C# already has a good singleton pattern built-in.

static class Foo

If you need anything more interesting than that, chances are your new singleton is going to be just different enough that your generic pattern is going to be useless.

EDIT: By "anything more interesting" I'm including inheritance. If you can inherit from a singleton, it isn't a singleton any more.

Jonathan Allen
  • 68,373
  • 70
  • 259
  • 447
  • Wrong. There are quite a few situations where singletons are useful and static classes do not work eg. try making this static. public TimeSpan this[string filename] { get { return new TimeSpan(); } set { } } – Sam Saffron Sep 19 '08 at 07:05
  • Also, you can't inherit static methods so you can't use inheritance to build your singleton class. – Wayne Bloss Nov 15 '08 at 05:47
  • I'll amend my comment... a static class is a GOOD solution for grouping static methods, but technically, it does not implement singleton since there is no "instance" and you don't get instance semantics like inheritance. – Wayne Bloss Nov 15 '08 at 05:58
  • The singleton could implement an interface or extend another class. That will work in static a static class with static methods. – Fedearne Aug 27 '10 at 09:55