`

Java单态模式的实现

    博客分类:
  • Java
阅读更多

1.饿汉式:
public class Singleton{
  // 在自己内部定义一个自己的实例
  // 注意,这个是private 只供内部调用
  private static Singleton instance = new Singleton();
  //将构造函数设为私有
  private Singleton(){
    }
   // 静态工厂方法,提供一个供外部使用得到对象的静态方法
  public static Singleton getInstance(){
          return instance;   
        }                                   
}


2. 懒汉式:

 public class Singleton{
    private static Singleton instance = null;
    private Singleton(){
            }
    public static synchronized Singleton getInstance (){
        if(instance==null)
        instance = new Singleton();       
        return instance;
        }
}

 

使用 Java 语法的双重检验锁定 Singleton 代码

// C++ port to Java
class Singleton {
 public static Singleton Instance() {
   if (_instance == null) {
    synchronized (Class.forName("Singleton")) {
     if (_instance == null) {
     _instance = new Singleton();
    }
   }
  }
return _instance;
}
protected Singleton() {
}
private static Singleton _instance = null;
} 

 在使用 Java 语法的双重检验锁定 Singleton 代码示例中,我们直接将 C++ 代码移植到 Java 代码,以便利用 Java 关键部分块(已同步)。 主要差别是不再有单独的声明和实现部分,没有指针数据类型,并且采用了新的双重检验机制。 双重检验发生在第一个 IF 块上。 如果成员变量为空,则执行进入关键部分块,该块再次双重检验该成员变量。 仅在通过此最终测试后,才会实例化该成员变量。 一般来说,两个线程无法使用这种方法创建两个类实例。 另外,因为在第一次检查时没有出现线程阻塞,所以对此方法的大多数调用不会由于必须进入锁定而导致性能下降。 目前,在实现 Singleton 模式时,很多 Java 应用程序中都广泛使用这种方法。 这种方法很巧妙,但也有瑕疵。 某些优化编译器可以将惰性初始化代码优化掉或对其重新进行排序,并且会重新产生线程安全问题。 有关更深入的解释,请参阅 "The Double-Check Locking is Broken" Declaration。

 另一种试图解决此问题的方法可能是,在成员变量声明中使用 volatile 关键字。 这应该告诉编译器不要对代码重新排序,并且放弃优化。 目前,这是唯一建议的 JVM 内存模型,并且不会立即解决该问题。

 实现 Singleton 的最好方法是什么? 最终(而不是碰巧),Microsoft .NET 框架解决了所有这些问题,从而更易于实现 Singleton,却不会产生我们目前讨论的不利副作用。 .NET 框架以及 C# 语言允许我们在必要时通过替换语言关键字,将上述的 Java 语法移植到 C# 语法。 因此,Singleton 代码变为以下内容:

C# 编码的双重检验锁定

// Port to C#
class Singleton {
 public static Singleton Instance() {
   if (_instance == null) {
   lock (typeof(Singleton)) {
    if (_instance == null) {
     _instance = new Singleton();
    }
   }
  }
return _instance;
}
protected Singleton() {
}
private static volatile Singleton _instance = null;
分享到:
评论

相关推荐

    23种设计模式的java实现

    单态模式 http://www.cnblogs.com/java-my-life/archive/2012/03/31/2425631.html 结构型 适配器模式 http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html 桥接模式 ...

    Java的23种设计模式疯狂Java总结.doc

    设计模式3 1.1 创立型模式4 1.1.1 工厂方法4 1.1.2 抽象工厂6 1.1.3 建造者模式10 1.1.4 单态模式13 1.1.5 原型模式15 1.2 构造型模式17 1.2.1 适配器模式17 1.2.2 桥接模式19 1.2.3 组合模式23 1.2.4 装饰模式26 ...

    Java封装继承多态实例以及文件流操作

    Java封装继承多态实例以及文件流操作,自己整理的东西,用了单态模式实现了多态,并且贯彻了OOP思想,用到了文件流的写入与读取,希望对大家有帮助

    设计模式整理(很全)

    创建模式 设计模式之Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之Factory(工厂方法和抽象工厂) 使用工厂模式就象使用new一样频繁....

    java设计模式CatalogDAOFactory是典型的工厂方法

    在上面的一段代码中一共用了三种模式,除了工厂模式外,还有Singleton单态模式,以及proxy模式,proxy模式主要用来授权用户对forum的访问,因为访问forum有两种人:一个是注册用户 一个是游客guest,那么那么相应的权限就不...

    java类的设计举例-animal

    5. 公司实现单态模式设计,所有动物都是属于这间公司的。 6. 可以从键盘输入许多不同的选择,选择对动物进行不同的操作,并且所有的输入都进行了异常的处理。 7. 采用多线程售卖动物,实现三个窗口同时售卖,并且...

    图书进存销系统java完整代码

    实现了一个简单的图书进存销系统,学习了使用JDBC进行数据库操作,使用Java的反射技术封装数据,使用单态模式去获得数据库连接,图片的压缩处理等知识点。

    java基础案例与开发详解案例源码全

    6.5.4 单态模式170 6.6 final修饰符171 6.7 abstract修饰符172 6.8 接口173 6.8.1 接口的定义及实现174 6.8.2 接口中的常量174 6.8.3 接口的多重实现174 6.9 本章练习175 第7章 7.1 面向对象的分析与设计简介180 ...

    二十三种设计模式【PDF版】

    GoF 的《设计模式》是所有面向对象语言(C++ Java C#)的基础,只不过不同的语言将之实现得更方便地使用。 GOF 的设计模式是一座"桥" 就 Java 语言体系来说,GOF 的设计模式是 Java 基础知识和 J2EE 框架知识之间一...

    图书进存销系统(练手项目九)

    * 学习了使用JDBC进行数据库操作,使用Java的反射技术封装数据,使用单态模式去获得数据库连接, 图片的压缩处理等知识点 * 在界面中主要使用JTable的处理,表现层、业务层与数据访问层的分层结构, 大大减低...

    基于SSH框架的音乐网站设计与实现

    本音乐网站基于Java Web技术,采用SSH轻量级框架组合进行设计与实现。网站利用UML建模,结合用户体验进行开发。网站的功能模块主要包括:登录注册、个人信息维护、用户/音乐/新闻管理、排行榜、播放器、个人收藏列表...

    办公用品管理系统(JAVA+JSP+servlet).rar

    参考设计模式:单态、工厂、DAO、MVC等 具体实现的功能及模块划分如下表: 功能类别 子功能 功能描述 办公用品使用 浏览办公用品 用户根据自己的权限,浏览可以申请的办公用品,可以查看要领用物品的详细信息及...

    Spring面试题

    在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是 Java 类...

Global site tag (gtag.js) - Google Analytics