标签:单线程 单例对象 实例化 color ola 多线程实例 设计模式之单例模式 时间 一个
单例模式的定义如下:
单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类成为单例类,它提供全局访问的方法。单例模式是一种对象创建型模型。
单例模式的分类:
饿汉单例
懒汉单例
单线程单例
多线程单例
饿汉单例:
public class EagerSingleton { // 由于在定义变量的时候实例化单例类,在类加载时就已经创建了单个对象。 private static EagerSingleton instance = new EagerSingleton(); private EagerSingleton() { } public static EagerSingleton GetInstance() { return instance; } }
懒汉单例:
//在第一次调用GetInstance()方法时实例化,在类加载并不自行实例化。这种技术叫做延迟加载(Lazy Load),就是在需要的时候在加载实例。 //为了避免多线程调用GetInstance方法。加lock public class LazySingleton { private static LazySingleton instance = null; private LazySingleton() { } public static LazySingleton GetInstance() { if(instance == null) { new LazySingleton(); } return instance; } }
单线程单例模式:
public class SingleThreadSingleton { private static SingleThreadSingleton instance = null; private SingleThreadSingleton() { } public static SingleThreadSingleton GetInstance() { if(instance == null) { instance = new SingleThreadSingleton(); } return instance; } }
多线程单例:
public class MultiThreadSingleton { private static MultiThreadSingleton instance; private static readonly object syncRoot = new object();//静态的只读的辅助对象 private MultiThreadSingleton() { } public static MultiThreadSingleton GetInstance() { lock (syncRoot) // 同一时刻枷锁的这部分程序只有一个线程进入。但是有一个问题这样会影响效率 { if(instance == null) { instance = new MultiThreadSingleton(); } } return instance; } }
多线程实例改良版:
public class MultiThreadSingleton { // volatile 保证严格意义的多线程编译器在代码编译时对指令不进行微调 private static volatile MultiThreadSingleton instance = null; private static readonly object syscRoot = new object(); private MultiThreadSingleton() { } public static MultiThreadSingleton GetInstance() { if(instance == null)// 多个线程调用GetInstance方法时,都可以通过第一重if(instance == null),可以提升效率 { lock (syscRoot) //只有一个线程时进入 { if(instance == null) // 如果没有这层,第一个线程创建了实例,第二个线程还可以创建实例。 { instance = new MultiThreadSingleton(); } } } return instance; } }
静态单例模式:
public class StaticSingleton { public static readonly StaticSingleton instance = new StaticSingleton(); private StaticSingleton() { } }
public class StaticSingleton { public static readonly StaticSingleton instance; private StaticSingleton() { } static StaticSingleton() { instance = new StaticSingleton(); } }
饿汉单例与懒汉单例类比较
饿汉单例在类被加载时就将自己实例化,它的优点在于无需考虑多线程访问问题,可以保证实例的唯一性;从调用速度和反应时间角度来讲,由于单例对象一开始就得以创建,因此要优于懒汉式单例。但是无论系统在运行时是否需要使用该单例对象,由于在类加载时该对象
标签:单线程 单例对象 实例化 color ola 多线程实例 设计模式之单例模式 时间 一个
原文地址:https://www.cnblogs.com/sy-liu/p/13079937.html