没有合适的资源?快使用搜索试试~ 我知道了~
1. 写法一(只适用于单线程环境) public sealed class Singleton1 { private Singleton1(){} private static Singleton1 instance = null; public static Singleton1 Instance { get { if(instance == null) instance = new Singleton1(); return instance; } } } 写法一中的代码再多线程中会有问题。若两个线程同时判读instan
资源推荐
资源详情
资源评论
C#中的五种单例模式(中的五种单例模式(SIngleton))
1. 写法一(只适用于单线程环境)写法一(只适用于单线程环境)
public sealed class Singleton1
{
private Singleton1(){}
private static Singleton1 instance = null;
public static Singleton1 Instance
{
get
{
if(instance == null)
instance = new Singleton1();
return instance;
}
}
}
写法一中的代码再多线程中会有问题。若两个线程同时判读instance是否为null,且instance没有创建时,那么两个线程都会
创建一个实例,此时已符合单例模式的要求了。
写法二(虽然能在多线程环境中工作但效率不高)
public sealed class Singleton2
{
private Singleton2(){}
private static readonly object syncObj = new Object();
private static Singleton2 instance = null;
public static Singleton2 Instance
{
get
{
lock(syncObj)
{
if(instance == null)
instance = new Singleton1();
}
return instance;
}
}
}
我们还是假设有两个线程同时想创建一个实例。由于在一个时刻只有一个线程能得到同步锁,当第一个线程加上锁时,第二个
线程只能等待。当第一个线程发现实例还没有创建时,它创建出一个实例。接着第一个线程释 放同步锁,此时第二个线程可
以加上同步锁,并运行接下来的代码。
这个时候由于实例已经被第一个线程创建出来了,第二个线程就不会重复创建实例了,这样就保证了我们在多线程环境中也只
能得到一个实例。但我们每次通过Instance获取实例时,都会试图加上一个同步锁,而加锁是一个十分耗时的操作,在没有必
要的时候我们应该尽量避免。
写法三(加同步锁前后两次判断实例是否已存在)
public sealed class Singleton3
{
private Singleton3(){}
private static readonly object syncObj = new Object();
private static Singleton3 instance = null;
public static Singleton3 Instance
{
get
{
if(instance == null)
{
lock(syncObj)
{
if(instance == null)
instance = new Singleton1();
}
资源评论
weixin_38672840
- 粉丝: 9
- 资源: 893
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功