从C#角度 单例模式 懒汉和饿汉

单例模式:
   
     关键点: 1、一个类只有一个实例; 2、类自行创建该实例; 3、类自行向整个系统提供该实例。

代码展示:

namespace SingleTon
{
    /// <summary>
    /// 懒汉单例、多线程安全
    /// 比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢
    /// </summary>
    public class LazySingleTon
    {
        private static LazySingleTon instance = null;
        //多线程安全
        private static object lockObject = new object();
        private LazySingleTon()
        {
            Console.WriteLine("private LazySingleTon()");
        }

        public static LazySingleTon Instance
        {
            get
            {
                //不必每次锁,提高效率
                if (instance == null)
                {
                    //多线程安全
                    lock (lockObject)
                    {
                        if (instance == null)
                        {
                            return new LazySingleTon();
                        }
                    }
                }
                return instance;
            }
        }
    }

    /// <summary>
    /// 饿汉单例
    /// 在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快
    /// </summary>
    public class EagerSingleTon
    {
        // readonly 分配的动态内存
        private static readonly EagerSingleTon instance = new EagerSingleTon();

        private EagerSingleTon()
        {
            Console.WriteLine("private EagerSingleTon()");
        }

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

    }
    class Program
    {
        static void Main(string[] args)
        {
            var lazy = LazySingleTon.Instance;
            var eager = EagerSingleTon.Instance;
        }
    }
}

原文地址:https://www.cnblogs.com/uicodeintoworld/p/8986785.html

时间: 2024-10-18 07:49:14

从C#角度 单例模式 懒汉和饿汉的相关文章

C++ 单例模式(懒汉、饿汉模式)

1.简单的单例模式实现 2.C++的构造函数不是线程安全的,所以上述代码在多线程的情况下是不安全的,原因是new Singelton时,这句话不是原子的,比如一个线程执行了new的同时,另一个线程对if进行判断(此时实例还没被创建出来).在windows下模拟: #include <iostream> #include <process.h> #include <windows.h> using namespace std; class Singelton{ priva

单例模式[ 懒汉模式 | 饿汉模式 ]

程序开发中,有些对象只需要一个,比如 配置文件/ 工具类/ 线程池/ 缓存/ 日志对象等.只需要一个单例模式: 可以保证某些对象在程序运行中只有唯一的一个实例.显然单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例. 具体实现角度来说:one:单例模式的类只提供私有的构造函数,two:类定义中含有一个该类的静态私有对象,thr:该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象 单例模式:应用场合: 有些类的对象只需要一

单例中懒汉和饿汉的本质区别

单例中懒汉和饿汉的本质区别在于以下几点: 1.饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变.懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的. 2.从实现方式来讲他们最大的区别就是懒汉式是延时加载,他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,饿汉式无需关注多线程问题.写法简单明了.能用则用.但是它是加载类时创建实例(上面有个朋友写错了).所以如果是一个工厂模式.缓存了很多实例.那么就得考虑效率问

单例模式下的懒汉和饿汉模式

1 //单例模式---懒汉模式 2 public class Apple{ 3 //创建一个成员,在内存中只有一个拷贝 4 private static Apple apple = null; 5 private Apple(){ 6 7 } 8 //这个方法用来创建实例 9 public static Apple Instance(){ 10 if(appel == null){ 11 Apple apple = new Apple(); 12 } 13 return apple; 14 }

Java面试题之在多线程情况下,单例模式中懒汉和饿汉会有什么问题呢?

懒汉模式和饿汉模式: public class Demo { //private static Single single = new Single();//饿汉模式 private static Single single2 = null;//饿汉模式 public Demo() { if (single2 == null) {//1 single2 = new Single();//2 } } } 在多线程环境下,代码1和代码2之间,这里会有线程安全问题,线程A和线程B同时到代码1和代码2之

单例模式中的饿汉模式和懒汉模式【一看就懂】

以Java为例: 饿汉: public final class VirtualCore { private static VirtualCore gCore = new VirtualCore(); private VirtualCore() { } public static VirtualCore get() { return gCore; } } 懒汉: public final class VirtualCore { private static VirtualCore gCore =

Java单例模式--------懒汉式和饿汉式

单件模式用途:单件模式属于工厂模式的特例,只是它不需要输入参数并且始终返回同一对象的引用.单件模式能够保证某一类型对象在系统中的唯一性,即某类在系统中只有一个实例.它的用途十分广泛,打个比方,我们开发了一个简单的留言板,用户的每一次留言都要将留言信息写入到数据库中,最直观的方法是没次写入都建立一个数据库的链接.这是个简单的方法,在不考虑并发的时候这也是个不错的选择.但实际上,一个网站是并发的,并且有可能是存在大量并发操作的.如果我们对每次写入都创建一个数据库连接,那么很容易的系统会出现瓶颈,系统

单例模式の懒汉式和饿汉式

单例模式,是用来解决一次只能实例化一个对象的问题. 根据对象实例化的先后,有两种实现方式: 懒汉式 饿汉式 下面是在代码中有详细的说明两种实现方法 package 设计模式; /* * 单例的设计模式(饿汉式) * 1.解决的问题:使得一个类只能够创建一个对象 * 2.如何实现 * */ public class SingletonTest { public static void main(String[] args) { Singleton s1 = Singleton.getInstanc

字符类型和控制语句、函数、懒汉、饿汉式

1. 小数默认为double类型. 2. 逻辑运算符:&&,||,!,&,|,^ 3. 位运算:      & ,|,^,~,<<,>>,>>> a^b^b = a(得到本身) 位运算是最快的运算方法 两个数值的调换位置的方法: 1.设置一个变量 int a = 1,b  = 2,c; c = a; a = b; b = c; 2.直接通过相加减我完成 int a  = 1,b = 2; a = a + b; b = a - b;