`
yiminghe
  • 浏览: 1431619 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 单例模式探讨

    博客分类:
  • java
阅读更多

Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦。

 

总结一下我所知道的单例模式实现方式:

 

1.预先加载法

 

class S1 {
    private S1() {
        System.out.println("ok1");
    }


    private static S1 instance = new S1();

    public static S1 getInstance() {
        return instance;
    }
}

 

优点:  

1.线程安全的

2.在类加载的同时已经创建好一个静态对象,调用时反应速度快。

缺点: 资源利用效率不高,可能getInstance永远不会执行到,但是执行了该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化了

 


2.initialization on demand,延迟加载法  (考虑多线程)

 

class S2 {
    private S2() {
        System.out.println("ok2");
    }

    private static S2 instance = null;

    public static synchronized S2 getInstance() {
        if (instance == null) instance = new S2();
        return instance;
    }
}

 

优点: 资源利用率高,不执行getInstance就不会被实例,可以执行该类其他静态方法。


缺点: 第一次加载时发应不快  ,多线程使用不必要的同步开销大

 

3.initialization on demand double check 双重检测( 考虑多线程 )

 

class S3 {
    private S3() {
        System.out.println("ok3");
    }

    private static S3 instance = null;

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

 

优点: 资源利用率高, 不执行getInstance就不会被实例,可以执行该类其他静态方法。


缺点: 第一次加载时发应不快  ,由于java 内存模型一些原因偶尔会失败

 


4.initialization on demand holder  (考虑多线程)

 

class S4 {
    private S4() {
        System.out.println("ok4");
    }

    private static class S4Holder {
        static S4 instance = new S4();
    }


    public static S4 getInstance() {
        return S4Holder.instance;
    }
}

 

优点: 资源利用率高, 不执行getInstance就不会被实例,可以执行该类其他静态方法。


缺点: 第一次加载时发应不快

 

 

 

总结: 一般采用 1 即可,若对资源十分在意也可考虑 4 ,不要使用2,3了。

 

 

测试代码:(暂不探讨Class.forName类加载机制)

 

/**
 * Created by IntelliJ IDEA.
 * User: yiminghe
 * Date: 2009-6-8
 * Time: 19:20:52
 */
public class Singleton {
    public static void main(String[] args) throws Exception{
        System.out.println(Class.forName("S1"));
        System.out.println(Class.forName("S2"));
        System.out.println(Class.forName("S3"));
        System.out.println(Class.forName("S4"));
    }
}

/*
    预先加载法
    优点:1.线程安全的,
          2.在类加载的同时已经创建好一个静态对象,调用时反应速度快。

    缺点: 资源利用效率不高,可能这个单例不会需要使用也被系统加载
 */
class S1 {
    private S1() {
        System.out.println("ok1");
    }


    private static S1 instance = new S1();

    public static S1 getInstance() {
        return instance;
    }
}

/*
    initialization on demand,延迟加载法  (考虑多线程)
    优点:1.资源利用率高
    缺点:第一次加载是发应不快  ,多线程使用不必要的同步开销大

 */
class S2 {
    private S2() {
        System.out.println("ok2");
    }

    private static S2 instance = null;

    public static synchronized S2 getInstance() {
        if (instance == null) instance = new S2();
        return instance;
    }
}


/*
    initialization on demand - double check 延迟加载法改进之双重检测  (考虑多线程)
    优点:1.资源利用率高
    缺点:第一次加载是发应不快  ,由于java 内存模型一些原因偶尔会失败

 */
class S3 {
    private S3() {
        System.out.println("ok3");
    }

    private static S3 instance = null;

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


/*
   initialization on demand holder  (考虑多线程)
   优点:1.资源利用率高
   缺点:第一次加载是发应不快

*/
class S4 {
    private S4() {
        System.out.println("ok4");
    }

    private static class S4Holder {
        static S4 instance = new S4();
    }


    public static S4 getInstance() {
        return S4Holder.instance;
    }
}
分享到:
评论
1 楼 fjmwishs 2013-03-01  
[color=red][/color][size=x-large][/size][align=center][/align]

相关推荐

    java单例模式完全剖析

    单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时...

    单例模式,single

    单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时...

    Kotlin中的5种单例模式示例详解

    所以对不同单例模式的实现进行了分别探讨。主要单例模式实现如下: 饿汉式 懒汉式 线程安全的懒汉式 双重校验锁式 静态内部类式 PS:该篇文章不讨论单例模式的运用场景与各种模式下的单例模式的优缺点。只讨论在...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...

    Java实例高难度面试题及解析 - 展现你的编程实力!

    您将了解如何正确创建对象实例、访问实例的成员变量和方法、实现对象的拷贝(包括浅拷贝和深拷贝)、判断对象相等性、管理对象的生命周期、实现线程安全的单例模式等。此外,我们还探讨了对象的哈希码、重写equals()...

    JavaPatterns:java模式实践

    创建型设计模式5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 2、在解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了开发人员关注的焦点,因为如何设计对象的结构、继承和...

    《PHP高级程序设计_模式、框架与测试》中文版PDF

    书中首先从oop采用的机制——抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和php 6的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准php库spl方面的知识以及php开发人员...

    研磨设计模式-part2

    第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11...

    研磨设计模式-part4

    第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11...

    研磨设计模式-part3

    第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11...

    实战Java高并发程序设计(第2版)PPT模板.pptx

    5并行模式与算法 5.1探讨单例模式 5.3生产者-消费者模式 5.5future模式 5.2不变模式 5.4高性能的生产者-消费者模式:无锁的实现 5.6并行流水线 01 02 03 04 05 06 实战Java高并发程序设计(第2版)PPT模板全文共25...

    PHP高级程序设计_模式、框架与测试(简体中文高清版)

    书中首先从OOP 采用的机制—— 抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和PHP 6 的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准PHP 库SPL 方面的知识以及PHP ...

    PHP高级程序设计_模式、框架与测试

    书中首先从oop采用的机制——抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和php 6的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准php库spl方面的知识以及php开发人员...

    程序员面试刷题的书哪个好-latico-designpattern:整套Java设计模式示例

    1、创建型模式(creational):单例模式、静态工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。 对创建对象进行统一管理,对外屏蔽创建对象的细节 软件设计的过程是循序渐进的,一步一步来的。在软件...

    java简易版开心农场源码-designPattern:设计模式代码

    反复使用:这个不用过多解释,设计模式被使用太多了,上个系列spring源码当中就出现了很多模式,记忆中比较深刻的有模板模式,代理模式,单例模式,工厂模式等等。 多数人知晓:这个就不需要过多解释了。 分类编目:...

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

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

Global site tag (gtag.js) - Google Analytics