蝈蝈俊.net

-- 用随笔来记录自己的技术感触
随笔 - 655, 评论 - 4839, 引用 - 276

导航

关于

这里是我的技术Blog,下一代CSDN社区Blog在 http://blog.csdn.net/ghj1976/

标签

每月存档

最新留言

  • re:WPF/Silverlight 控件的几幅继承关系图
    <p class="MsoNormal" style="text-align: center; line-height: 20pt; margin: 0cm 0cm...
    by oaoffices(注册) on 2010/2/7 18:38:37
  • tWTqXHvjmOmv
    XZ5W2T &lt;a href=&quot;http://zecclkdejwou.com/&quot;&gt;zecclkdejwou&lt;/a&am...
    by uwwkhptujtw(匿名) on 2010/2/7 11:26:16
  • Re
    Many times we wanted to order significant example thesis close to this topic in the &lt;a href=&...
    by Ellieru(匿名) on 2010/2/6 10:25:37
  • Rrwvthsw
    Very Good Site &lt;a href=&quot; http://www.newsland.it/nr/article/it-alt.faq/4163.html &...
    by Rrwvthsw(匿名) on 2010/2/6 5:51:43
  • Edozadcx
    Good crew it's cool :) &lt;a href=&quot; http://www.newsland.it/nr/article/it-alt.faq/4163.h...
    by Edozadcx(匿名) on 2010/2/6 3:56:25
  • Ptryjfhi
    i'm fine good work &lt;a href=&quot; http://www.newsland.it/nr/article/it-alt.faq/4143.html ...
    by Ptryjfhi(匿名) on 2010/2/6 2:52:34
  • samuel
    5l05ro http://www.cRk2bdPqQls602mIa4bgo.com
    by samuel(匿名) on 2010/2/5 4:00:27
  • samuel
    5l05ro http://www.cRk2bdPqQls602mIa4bgo.com
    by samuel(匿名) on 2010/2/5 4:00:25
  • qCSFwFqaMVQizlCas
    2dnR2u &lt;a href=&quot;http://geunkaxpmhqt.com/&quot;&gt;geunkaxpmhqt&lt;/a&am...
    by spahxbypafn(匿名) on 2010/2/5 1:47:48
  • Re
    Very oft the &lt;a href=&quot;http://quality-papers.com/topics/comparison_essay&quot;&am...
    by Gwen18uV(匿名) on 2010/2/4 16:16:33
  • samuel
    SnU3S6 http://www.cRk2bdPqQls602mIa4bgo.com
    by samuel(匿名) on 2010/2/4 15:37:58
  • Koxtggnh
    It's serious &lt;a href=&quot; http://www.newsland.it/nr/article/it-alt.faq/3298.html &q...
    by Koxtggnh(匿名) on 2010/2/4 6:09:20
  • SrehssllMZjp
    XefKdm &lt;a href=&quot;http://onztwqzldpty.com/&quot;&gt;onztwqzldpty&lt;/a&am...
    by fsfirjqclpn(匿名) on 2010/2/4 0:43:23
  • OLDLqAKsuD
    BnPVvu &lt;a href=&quot;http://jzyknfzplvon.com/&quot;&gt;jzyknfzplvon&lt;/a&am...
    by ofudghioo(匿名) on 2010/2/4 0:07:18
  • Hwbjmqub
    Punk not dead &lt;a href=&quot; http://www.newsland.it/nr/article/it-alt.faq/3238.html &...
    by Hwbjmqub(匿名) on 2010/2/3 14:14:20
  • Re
    From time to time different students have assignments to compose the &lt;a href=&quot;http:/...
    by Rebeccamp28(匿名) on 2010/2/3 11:04:43
  • emRTIwMZOMDFfCg
    nQf5M6 &lt;a href=&quot;http://eaykuvqnrful.com/&quot;&gt;eaykuvqnrful&lt;/a&am...
    by pnxjuwq(匿名) on 2010/2/2 23:36:36
  • jPRCuLgHySwb
    qc0qb5 &lt;a href=&quot;http://ciktzfijfsfj.com/&quot;&gt;ciktzfijfsfj&lt;/a&am...
    by yuplvewx(匿名) on 2010/2/2 19:05:07
  • re:IP to Integer
    IPV6呢?
    by howie(匿名) on 2010/2/2 10:34:10
  • IcqpxCPAVoKn
    Ff4AZo &lt;a href=&quot;http://bovwngagtlua.com/&quot;&gt;bovwngagtlua&lt;/a&am...
    by mbnbusiuh(匿名) on 2010/2/1 18:40:41
  • tJZDsNznVk
    scXyAq &lt;a href=&quot;http://pqtnkiwdacoa.com/&quot;&gt;pqtnkiwdacoa&lt;/a&am...
    by lwummgsncve(匿名) on 2010/2/1 3:53:51
  • Okurlpzt
    i'm fine good work &lt;a href=&quot; http://littlelolitasmodels.vox.com/ &quot;&gt;p...
    by Okurlpzt(匿名) on 2010/1/31 19:30:08
  • Sgoonhvn
    Excellent work, Nice Design &lt;a href=&quot; http://littlelolitasmodels.vox.com/ &quot;...
    by Sgoonhvn(匿名) on 2010/1/31 18:29:47
  • Zloozuuj
    Punk not dead &lt;a href=&quot; http://lolitatoplist.vox.com/ &quot;&gt;lolita mpeg...
    by Zloozuuj(匿名) on 2010/1/31 17:52:04
  • Jmqskdlf
    I love this site &lt;a href=&quot; http://younglolitasbbs.vox.com/ &quot;&gt;preetee...
    by Jmqskdlf(匿名) on 2010/1/31 15:09:12
  • Tmmhaxbr
    Wonderfull great site &lt;a href=&quot; http://lolitabbs969.vox.com &quot;&gt;lolita...
    by Tmmhaxbr(匿名) on 2010/1/31 14:31:36
  • Asnejtjx
    real beauty page &lt;a href=&quot; http://underagelolitas.vox.com/ &quot;&gt;top 50 ...
    by Asnejtjx(匿名) on 2010/1/31 12:51:18
  • Tibtihsu
    &lt;a href=&quot; http://lolitamodels.vox.com/ &quot;&gt;real young lolitas&lt;...
    by Tibtihsu(匿名) on 2010/1/31 7:50:15
  • Jlcdzoem
    Very Good Site &lt;a href=&quot; http://lolitamodels.vox.com/ &quot;&gt;kds pedo lol...
    by Jlcdzoem(匿名) on 2010/1/31 6:47:06
  • Eqczveev
    i'm fine good work &lt;a href=&quot; http://mipagina.univision.com/preteenlolitabbs/ &qu...
    by Eqczveev(匿名) on 2010/1/31 6:08:16
  • Ndhvewjd
    Very interesting tale &lt;a href=&quot; http://mipagina.univision.com/preteenlolitabbs/ &...
    by Ndhvewjd(匿名) on 2010/1/31 5:06:34
  • Jktojpnv
    &lt;a href=&quot; http://mipagina.univision.com/preteenlolitamodels/ &quot;&gt;goth...
    by Jktojpnv(匿名) on 2010/1/31 3:27:26
  • Lftiemmn
    Very interesting tale &lt;a href=&quot; http://mipagina.univision.com/preteenyounglolitas/ &...
    by Lftiemmn(匿名) on 2010/1/31 2:51:02
  • ITYAtUVjqijsAcZ
    4SnRK4 &lt;a href=&quot;http://lbmuqlnscvjk.com/&quot;&gt;lbmuqlnscvjk&lt;/a&am...
    by pqoqxfvrbcb(匿名) on 2010/1/30 19:25:06
  • bjhbHxudMahxGCkiue
    3mRPzg &lt;a href=&quot;http://rzitclgaemis.com/&quot;&gt;rzitclgaemis&lt;/a&am...
    by quglkot(匿名) on 2010/1/30 19:20:51

广告

 

Singleton模式是最简单的模式,比较汗颜的是自己一直以来使用的是单线程的Singleton模式,最近在听了李建忠老师的模式讲座录像后,才发现自己一直没注意到这点。这个录像讲座在后面给出了链接地址: C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)

下面内容整理自李建忠老师的讲课内容:

单线程的Singleton模式

    public class Singleton
    {
        private static Singleton instance;

        private Singleton() { }

        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                    instance = new Singleton();
                return instance;
            }
        }
    }

要点:

  • Singleton模式中的实例构造器可以设置为protected以允许子类派生。
  • Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
  • Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样跟Singleton模式的初衷违背。
  • Singleton模式只考虑到了对象创建的管理,并没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没必要对其销毁进行特殊的管理。
  • 上述代码不支持多线程环境,上述代码在多线程下,仍然有可能得到Singleton类的多个实例。

多线程的Singleton模式

    public class Singleton
    {
        private static volatile Singleton instance = null;

        private static object lockHelper = new object();

        private Singleton() { }

        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (lockHelper)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }

代码说明:

  • volatile C#关键字作用,简单来说,编译器编译我们的代码时候,会对代码作一些优化,进而对代码进行了微调,使用volatile关键字就可以避免这个微调。继而严格意义上保证不会产生多线程。更详细的关于volatile 的说明,请看参考资料。
  • 双检查加锁模式。在lock之外和之内,我们做了instance是否为空的检查。这叫双检查。因为同步控制的时间太长了。双检查能够最高效地实现多线程安全的访问。

使用.net特有的支持多线程的单件模式代码

    public sealed class Singleton
    {
        public static readonly Singleton Instance = new Singleton();
        private Singleton() { }
    }

代码说明:

  • sealed 修饰符表示该类是密封类,不能被继承。你可以按需修改。
  • 这里readonly关键字只是不希望客户程序将Instance字段设置为null等不合理的值。
  • *** static *** = new Singleton(); 是使用了内联初始化技术,这部分初始化其实是在static Singleton()中执行的。即上面的代码相当于:
  •     public sealed class Singleton
        {
            public static readonly Singleton Instance;
            static Singleton()
            {
                Instance = new Singleton();
            }
            private Singleton() { }
        }
  • 上述代码在编译时,会使用一个名为beforefieldinit元数据标志。此标志使得运行库能够在任何时候执行类型构造函数方法,只要该方法在第一次访问该类型的静态字段之前执行即可。换句话说,beforefieldinit 为运行库提供了一个执行主动优化的许可。如果没有 beforefieldinit,运行库就必须在某个精确时间运行类型构造函数,即,恰好在第一次访问该类型的静态或实例字段和方法之前。
  • 静态构造器自身就可以保证,多线程情况下,系统就可以保证只有一个执行。

缺点:

  • 不支持参数化单件构造器。即静态构造器不支持参数,就导致我们无法利用静态构造器实现传参数的单件。

 

参考资料:

讲讲volatile的作用
http://blog.21ic.com/user1/2949/archives/2007/35599.html

Implementing the Singleton Pattern in C#
http://www.yoda.arachsys.com/csharp/singleton.html

初始化内联引用类型静态字段
http://msdn.microsoft.com/zh-cn/library/ms182275.aspx

通过七个关键编程技巧得益于静态内容
http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/us0501StaticsinNET.mspx?mfr=true

模式设计c#--创建型--Singleton
http://www.cppblog.com/mzty/archive/2006/01/03/2384.html

打印 | 张贴于 2009-04-13 10:52:39 | Tag:.net 编程心得  技术随笔  .net 3.5  设计思路  读书笔记  .net 3.0  .Net 4.0

留言反馈

#re:多线程Singleton单件模式 编辑
//Another way

public
class Singleton
{
private static volatile Singleton instance = null;

private Singleton() { }

public static Singleton Instance
{
get
{
if (instance == null)
{
Interlocked.CompareExchange(ref instance, new Singleton(), null)
}
return instance;
}
}
}
2009-04-22 14:02:35 | Yaojian

发表留言

标题
姓名
邮件
主页
留言 

Powered by: Joycode.MVC引擎 0.5.2.0