<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/dotnet-csharp-singleton-html/</link>
<title><![CDATA[C#中有关单例模式的详解]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Mon, 20 Sep 2010 17:54:21 +0000</pubDate> 
<guid>https://www.heckjj.com/dotnet-csharp-singleton-html/</guid> 
<description>
<![CDATA[ 
	<span style="font-family: 微软雅黑;"><span style="font-size: 14px;"><strong><span style="color: #4169E1;">关于单例模式的一些要点：</span></strong></span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.Singleton模式中的实例构造器可以设置为protected以允许子类派生。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.Singleton模式一般不要支持ICloneable接口，因为这可能会导致多个对象实例，与Singleton模式的初衷违背。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.Singleton模式一般不要支持序列化，因为这也有可能导致多个对象实例，同样跟Singleton模式的初衷违背。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.Singleton模式只考虑到了对象创建的管理，并没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲，我们一般没必要对其销毁进行特殊的管理。 <br/><br/><span style="font-size: 14px;"><strong><span style="color: #4169E1;">多线程的Singleton模式</span></strong></span></span><br/><textarea name="code" class="c#" rows="15" cols="100">public class Singleton
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private static volatile Singleton instance = null;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private static object lockHelper = new object();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private Singleton() &#123; &#125;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static Singleton Instance
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (instance == null)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock (lockHelper)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (instance == null)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance = new Singleton();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return instance;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;</textarea><br/><span style="font-family: 微软雅黑;">代码说明：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.volatile C#关键字作用，简单来说，编译器编译我们的代码时候，会对代码作一些优化，进而对代码进行了微调，使用volatile关键字就可以避免这个微调。继而严格意义上保证不会产生多线程。更详细的关于volatile 的说明，请看参考资料。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.双检查加锁模式。在lock之外和之内，我们做了instance是否为空的检查。这叫双检查。因为同步控制的时间太长了。双检查能够最高效地实现多线程安全的访问。 </span><br/><span style="font-size: 14px;"> <strong><span style="color: #4169E1;">使用.net特性的支持多线程的单件模式代码</span></strong></span><br/><textarea name="code" class="c#" rows="15" cols="100">
&nbsp;&nbsp; public sealed class Singleton
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static readonly Singleton Instance = new Singleton();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private Singleton() &#123; &#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
</textarea><br/><span style="font-family: 微软雅黑;">代码说明：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.sealed 修饰符表示该类是密封类，不能被继承。你可以按需修改。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.这里readonly关键字只是不希望客户程序将Instance字段设置为null等不合理的值。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.*** <span style="color: #0000FF;">static </span>*** = <span style="color: #0000FF;">new </span>Singleton(); 是使用了内联初始化技术，这部分初始化其实是在static Singleton()中执行的。即上面的代码相当于：</span><textarea name="code" class="c#" rows="15" cols="100">
&nbsp;&nbsp;public sealed class Singleton
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static readonly Singleton Instance;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static Singleton()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Instance = new Singleton();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private Singleton() &#123; &#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
</textarea><br/><span style="font-family: 微软雅黑;">上述代码在编译时，会使用一个名为beforefieldinit元数据标志。此标志使得运行库能够在任何时候执行类型构造函数方法，只要该方法在第一次访问该类型的静态字段之前执行即可。换句话说，beforefieldinit 为运行库提供了一个执行主动优化的许可。如果没有 beforefieldinit，运行库就必须在某个精确时间运行类型构造函数，即，恰好在第一次访问该类型的静态或实例字段和方法之前。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.静态构造器自身就可以保证，多线程情况下，系统就可以保证只有一个执行。 <br/>缺点：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.不支持参数化单件构造器。即静态构造器不支持参数，就导致我们无法利用静态构造器实现传参数的单件。 </span><br/>Tags - <a href="https://www.heckjj.com/tags/singleton/" rel="tag">singleton</a> , <a href="https://www.heckjj.com/tags/c%2523/" rel="tag">c#</a> , <a href="https://www.heckjj.com/tags/%25E5%258D%2595%25E4%25BE%258B/" rel="tag">单例</a> , <a href="https://www.heckjj.com/tags/.net/" rel="tag">.net</a> , <a href="https://www.heckjj.com/tags/%25E8%25BD%25AF%25E4%25BB%25B6%25E8%25AE%25BE%25E8%25AE%25A1/" rel="tag">软件设计</a> , <a href="https://www.heckjj.com/tags/%25E8%25AE%25BE%25E8%25AE%25A1%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">设计模式</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/dotnet-csharp-singleton-html/#blogcomment</link>
<title><![CDATA[[评论] C#中有关单例模式的详解]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/dotnet-csharp-singleton-html/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>