ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

23种设计模式->单例模式

2022-05-08 13:35:06  阅读:140  来源: 互联网

标签:调用 23 Show SingleLu 线程 单例 SingleSecond 设计模式 id


 

1.单例模式保证了整个进程中该对象只被实例化一次,该对象常驻内存

2.单例模式的三种写法

2.1 第一种方法: 双if加lock锁

//类

public class SingleLu
{      //第一步创建私有构造函数

 private SingleLu()
{
Console.WriteLine("{0}被构造,线程id={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
}

//第二部 创建私有静态变量

private static SingleLu _Singleton = null;
 private static object Singleton_Lock = new object();

public static SingleLu CreateInstance()
{
if (_SingleLu == null)//保证线程,不需要等待锁
{
Console.WriteLine("readyGo");
lock (SingleLu_Lock)//确保只有一个线程进入
{
        if (_SingleLu == null)//确保对象为空
        {
        _SingleLu = new SingleLu();
         }
}
}
return _SingleLu;
}

public void ComeOn()
{
Console.WriteLine("这里调用了{0}.Show,线程id={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
}

}

//异步多线程调用

List<IAsyncResult> asyncList = new List<IAsyncResult>();
for (int i = 0; i < 10; i++)
{
asyncList.Add( new Action(() =>
{
SingleLu singlelu = SingleLu.CreateInstance();
singlelu.ComeOn();
}).BeginInvoke(null, null));
}

控制台返回结果:

readyGo
readyGo
SingleLu被构造,线程id=7
readyGo
这里调用了SingleLu.Show,线程id=6
这里调用了SingleLu.Show,线程id=5
这里调用了SingleLu.Show,线程id=5
这里调用了SingleLu.Show,线程id=9
这里调用了SingleLu.Show,线程id=4
这里调用了SingleLu.Show,线程id=8
这里调用了SingleLu.Show,线程id=10
这里调用了SingleLu.Show,线程id=3
这里调用了SingleLu.Show,线程id=6
这里调用了SingleLu.Show,线程id=7

 

2.2 第二种方法

public class SingleSecond
{
private static SingleSecond _SingleSecond = null;//创建静态变量
static SingleSecond()//创建静态构造函数,由CLR保证,在第一次使用这个类之前调用而且只调用一次
{
_SingleSecond = new SingleSecond();
}

public static SingleSecond CreateInstance()//创建静态对象方法
{
return _SingleSecond;
}

public void ComeOnSecond()
{
Console.WriteLine("这里调用了{0}.Show,线程id={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
}

}

//异步多线程调用

List<IAsyncResult> asyncList = new List<IAsyncResult>();
for (int i = 0; i < 10; i++)
{
asyncList.Add(new Action(() =>
{
SingleSecond singlelu = SingleSecond.CreateInstance();
singlelu.ComeOnSecond();
}).BeginInvoke(null, null));//会启动一个异步多线程调用
}

返回结果

这里调用了SingleSecond.Show,线程id=8
这里调用了SingleSecond.Show,线程id=5
这里调用了SingleSecond.Show,线程id=5
这里调用了SingleSecond.Show,线程id=4
这里调用了SingleSecond.Show,线程id=3
这里调用了SingleSecond.Show,线程id=9
这里调用了SingleSecond.Show,线程id=8
这里调用了SingleSecond.Show,线程id=6
这里调用了SingleSecond.Show,线程id=7
这里调用了SingleSecond.Show,线程id=5

2.3 第三种方法

public class SingleThird
{
private SingleThird()//私有构造函数
{
Console.WriteLine("{0}被构造,线程id={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
}

/// <summary>
/// 静态变量:会在类型第一次使用的时候初始化,而且只初始化一次
/// </summary>
private static SingleThird _SingleThird = new SingleThird();

public static SingleThird CreateInstance()
{
return _SingleThird;
}
public void ComeOn()
{
Console.WriteLine("这里调用了{0}.ComeOn,线程id={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId);
}

}

//多线程调用

List<IAsyncResult> asyncList = new List<IAsyncResult>();
for (int i = 0; i < 10; i++)
{
asyncList.Add(new Action(() =>
{
SingleThird singlelu = SingleThird.CreateInstance();
singlelu.ComeOn();
}).BeginInvoke(null, null));//会启动一个异步多线程调用
}
while (asyncList.Count(r => !r.IsCompleted) > 0)
{
Thread.Sleep(10);
}

返回结果

SingleThird被构造,线程id=4
这里调用了SingleThird.ComeOn,线程id=4
这里调用了SingleThird.ComeOn,线程id=4
这里调用了SingleThird.ComeOn,线程id=4
这里调用了SingleThird.ComeOn,线程id=10
这里调用了SingleThird.ComeOn,线程id=7
这里调用了SingleThird.ComeOn,线程id=9
这里调用了SingleThird.ComeOn,线程id=5
这里调用了SingleThird.ComeOn,线程id=6
这里调用了SingleThird.ComeOn,线程id=3
这里调用了SingleThird.ComeOn,线程id=8

标签:调用,23,Show,SingleLu,线程,单例,SingleSecond,设计模式,id
来源: https://www.cnblogs.com/lu1993/p/16245378.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有