`
yiminghe
  • 浏览: 1460461 次
  • 性别: 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中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们来看**懒汉式(Lazy Initialization)**。这种实现方式是在类被首次请求时才创建单例对象,延迟...

    Java 单例模式 工具类

    本篇文章将深入探讨如何在Java中实现单例模式,以及如何创建一个工具类来封装单例的创建。 首先,让我们了解单例模式的几种常见实现方式: 1. 饿汉式(静态常量): 这是最简单的单例实现,它在类加载时就完成了...

    Java单例模式设计

    Java单例模式是一种常用的设计模式,它保证一个类只有一个实例,并提供全局访问点。这种模式在需要频繁创建和销毁对象的场景中,或者当对象昂贵时(如数据库连接),能够节省系统资源,提高效率。本篇文章将深入探讨...

    java单例模式的例子

    下面我们将深入探讨Java单例模式的概念、实现方式以及其优缺点。 **单例模式的概念** 单例模式的核心思想是限制类的实例化,只允许创建一个对象,同时提供一个全局访问点,使得这个唯一的实例可以被任何需要的地方...

    设计模式单例模式和工厂模式综合应用

    "设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...

    java单例模式代码实例

    下面我们将深入探讨Java单例模式的实现方式、优缺点以及注意事项。 一、单例模式的实现方式 1. 饿汉式(静态常量) 这是最简单的单例实现,通过静态常量在类加载时就初始化单例,保证了线程安全,但同时也意味着...

    Java单例模式与工厂模式简单示例代码

    在Java中,单例模式的实现通常有几种方法: 1. **饿汉式(静态常量)**:在类加载时就完成初始化,所以类加载比较慢,但获取对象的速度快,且线程安全。 ```java public class Singleton { private static final ...

    JAVA单例模式的登录案例

    根据给定的信息,我们可以深入探讨Java单例模式的登录案例,并从中提炼出多个重要的知识点。 ### 单例模式概述 单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式通常...

    java单例模式课程.pdf

    Java单例模式是一种设计模式,它允许类只有一个实例,并提供一个全局访问点。在上述的场景中,我们探讨了如何通过单例模式来优化读取配置文件的过程。配置文件是许多应用程序的重要组成部分,它们通常存储应用程序...

    JAVA单例模式(三种)

    Java单例模式是一种常用的软件设计模式,它的核心思想是确保一个类只有一个实例,并提供全局访问点。在Java编程中,单例模式被广泛应用于控制资源的共享,例如数据库连接池、线程池或者日志系统等。在本篇文章中,...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂 第二部分

    本篇将深入探讨标题中提及的几种设计模式:Model-View-Controller(MVC)模式、单例模式、代理模式以及工厂模式,尤其是简单工厂模式。 **1. Model-View-Controller (MVC) 模式** MVC模式是一种架构模式,它将应用...

    java 单例模式

    在《Java性能优化》一书中,作者深入探讨了单例模式的各种实现方式及其优化。 1. 最简单的实现方式是使用静态内部类,这种方式实现了延迟加载(lazy initialization),同时也保证了线程安全。如下所示: ```java ...

    三种工厂设计模式和两种单例模式

    在本文中,我们将深入探讨三种工厂设计模式——简单工厂模式、抽象工厂模式和工厂方法模式,以及两种单例模式——饿汉单例模式和懒汉单例模式。这些模式都是面向对象设计中的重要组成部分,对于理解和构建可维护、可...

    几种单例模式demo

    单例模式的实现方式有很多种,下面我们将详细探讨几种常见的单例模式的实现方法: 1. 饿汉式(静态常量): 这种方式在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private ...

    使用单例模式创建学生管理系统(饿汉式、懒汉式)

    在这个场景中,我们将探讨如何使用单例模式来创建一个学生管理系统,主要涉及“饿汉式”和“懒汉式”两种实现方式。 **饿汉式单例** 饿汉式单例在类加载时就完成了实例化,因此它是线程安全的。这种方式保证了单例...

    Java双重检查加锁单例模式的详解

    在这篇文章中,我们将探讨Java双重检查加锁单例模式的详解,包括它的优点和缺点,以及如何正确地使用它。 Java双重检查加锁单例模式的优点是延迟初始化和避免竞态条件。延迟初始化可以让程序启动更快,而避免竞态...

    使用java时间连接池连接redis,单例模式和集群模式.docx

    在这个资源中,我们将探讨如何使用 Java 客户端连接 Redis 集群,并实现单例模式和集群模式的连接。 Redis 集群 Redis 集群是一种高可用性的 Redis 部署方式,通过将多个 Redis 节点组成一个集群,可以提高整个...

    Java自定义连接池,单例模式

    在Java编程中,连接池和单例模式是两个非常重要的概念,它们对于高效地管理和使用数据库资源至关重要。这里我们将深入探讨这两个主题,并结合一个通用的BaseDao类来说明如何实现数据库的快速访问。 首先,连接池是...

Global site tag (gtag.js) - Google Analytics