• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
人生之路,职业之路
读书使人充实,交谈使人机敏,写记使人精确;
“动因+兴趣”——决心-持之以恒-见效
博客园    首页    新随笔    联系   管理    订阅  订阅
设计模式-单例模式

设计模式在软件设计中无处不在,今年上半年,在做平台业务组件时,就涉及到一些。

现在打算把设计模式在详细学习一下。

 

单例模式(Singleton):

定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

类型:创建型模式

单例模式是23种设计模式中最简单的一种模式。

1.饿汉式单例(静态初始化) 线程安全

静态初始化的方式是在自己被加载时就将自己实例化。

 

public sealed class Singleton
{
  private static readonly Singleton instance = new Singleton();
  private Singleton(){}
  public static Singleton GetInstance()
  {
     return instance;
  }
}

 

2.懒汉式单例  线程不安全

 在第一次被引用时,才会将自己实例化。即在调用取得实例方法的时候才会实例化对象。

 

 1 public class Singleton
 2 {
 3   private static Singleton singleton;
 4   private Singleton(){}
 5   
 6   public static synchronized Singleton getInstance()
 7   {
 8     if(singleton == null)
 9     {
10       singleton = new Singleton();
11     }
12     return singleton;
13   }
14 }

 

3.多线程情况

在多线程情况下,采用双重检查加锁机制实现,需要用到一个关键字volatile, 被volatile修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。

private volatile static Singleton instance = null;

public class Singleton
{
  private static Singleton instance;
  private static readonly object syncRoot = new object();

  private Singleton(){}

  public static Singleton GetInstance()
  {
    if(instance == null)
    {
       lock(syncRoot)
       {
          if(instance == null)
             instance = new Singleton();
       }
    }
    return instance;
  }
}

 

单例模式的优点:

  1. 在内存中只有一个对象,节省内存空间。
  2. 避免频繁的创建销毁对象,可以提高性能。
  3. 避免对共享资源的多重占用。
  4. 可以全局访问。

适用场景:

  1. 需要频繁实例化然后销毁的对象
  2. 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
  3. 有状态的工具类对象。
  4. 频繁访问数据库或文件的对象。
  5. 其他只需要一个对象的场景。

注意事项:

  1. 只能使用单例类提供的方法得到单例对象,不要使用反射,否则将会实例化一个新的对象。
  2. 不要做断开单例类对象与类中静态引用的危险操作。
  3. 多线程中单例使用共享资源时,注意线程安全问题。

在java中,饿汉式单例优于懒汉式单例。

 

 

 

 

 

posted on 2012-11-20 15:39  FreeBird  阅读(185)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3