`
lwbbupt
  • 浏览: 35264 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java设计模式——单例模式

阅读更多



一、什么情况下考虑使用“单例模式”?
          
        单例模式使得一个类在任何情况下只有一个对象,通常当需要一个类来管理共享的资源(例如:线程池、注册表,缓存等)可以使用单例模式,因为我们需要保证这些全局资源只有一份。

        单例模式的概念:

        单例模式确保一个类只能有一个实例,而且为这个实例提供了一个全局访问点。

二、如何实现单例模式?

        ①将构造方法私有化

        ②通过一个private静态变量记录单例类的唯一实例。

        ③定义一个获取该实例静态方法。        实现如下:

public class Singleton {
    private static Singleton singleton;

    private Singleton(){} //构造方法私有化

    public static Singleton getInstance(){
        if(singleton == null)
            singleton = new Singleton();
        return singleton;
    }

 以上便实现了简单的单例模式,但是在多线程时可能会出现错误,所以需要对程序进行简单的修改如下:

 

对getInstance()方法添加同步锁:

 

public static synchronized Singleton getInstance() {
        if (singleton == null)
            singleton = new Singleton();
        return singleton;
    }

 这样可以保证在其他线程进入getInstance()方法时需等待其他方法执行完getInstance()方法。

 

 

然而如果程序访问getInstance()方法的频率很高,这就会产生效率问题,我们可以采用单例中的饿汉模式,代码如下:

 

public class Singleton {
    private static Singleton singleton = new Singleton();

    private Singleton() {
    } //构造方法私有化

    public static  Singleton getInstance() {
        return singleton;
    }
}

 这样就可以使得JVM在加载这个类时就创建这个类的唯一实例,那么即使在多线程中也不会出现问题。

 

 

        然而如果程序中我们可能很多情况下不要调用这个类的话,加载马上就创建实例,又会造成很大的浪费,我们该怎么办呢?

       可以使用“双重检查加锁”,在getInstance()中减少使用同步,只有在创建实例时添加同步锁,代码如下:

 

public class Singleton {
    private volatile static Singleton uniqueInstance;

    private Singleton() {
    } //构造方法私有化

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

 注意:uniqueInstance使用了volatile关键词修饰,volatile使得线程对缓存中数据的修改强制的写入主存,同时使得cpu中其他的线程缓存无效,需要从主存中重新读取(对多线程我也不太了解,以后慢慢学习吧)。

需要注意的是“双重检查加锁”不适用java 1.4及其以前版本。

 

在维基百科中也找到了关于延迟加载同时又避免加锁的另一个版本

     In software engineering, the Initialization on Demand Holder (design pattern) idiom is a lazy-loaded singleton. In all versions of Java, the idiom enables a safe, highly concurrent lazy initialization with good performance.

 

public class Singleton {
    private static class LazyHolder{
       private static final Singleton uniqueInstance = new Singleton();
    }

    private Singleton() {
    } //构造方法私有化

    public static  Singleton getInstance() {
        return LazyHolder.uniqueInstance;
    }
}

 

 

 

 

  • 大小: 11.1 KB
1
0
分享到:
评论

相关推荐

    设计模式——单例模式

    是http://blog.csdn.net/lxq_xsyu/article/category/1544127博客中java设计模式的源代码。下载前请先看《设计模式——单例模式》一文。

    java设计模式之——单例模式

    单例模式源代码 博文链接:https://yangguangfu.iteye.com/blog/815944

    Java设计模式 版本2

    Java设计模式,目录:前言,UML建模技术,深入浅出UML类图,从招式与内功谈起——设计模式概述,面向对象设计原则,工厂三兄弟之简单工厂模式,工厂三兄弟之工厂方法模式,工厂三兄弟之抽象工厂模式,确保对象的唯一...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    design-pattern-java.pdf

    (二) 确保对象的唯一性——单例模式 (三) 确保对象的唯一性——单例模式 (四) 确保对象的唯一性——单例模式 (五) 原型模式-Prototype Pattern 对象的克隆——原型模式(一) 对象的克隆——原型模式(二) ...

    java和设计模式ppt教程

    java和设计模式ppt包含工厂模式、建造模式、原始模型模式、单例模式、结构模式、适配器、桥梁模式、合成模式、装饰模式、门面模式、享元模式、代理模式、行为模式、解释器模式、迭代子模式、调停者模式、备忘录模式...

    深入浅出设计模式(中文版电子版)

    3.6SingletonPattern(单例模式) 82 3.6.1定义 82 3.6.2现?抵械牡ダ??猈indowsTaskManager 83 3.6.3C#实例——负载均衡控制器 84 3.6.4Java实例——系统日志 86 3.6.5DoubleCheckLocking(双检锁) 89 3.6.6...

    深入浅出设计模式(中文版)

    3.6SingletonPattern(单例模式) 82 3.6.1定义 82 3.6.2现?抵械牡ダ??猈indowsTaskManager 83 3.6.3C#实例——负载均衡控制器 84 3.6.4Java实例——系统日志 86 3.6.5DoubleCheckLocking(双检锁) 89 3.6.6...

    设计模式——开发常用的设计模式梳理

    本文来自51cto,文章主要介绍了策略模式、观察者模式、装饰模式、单例模式以及饿汉模式等的相关内容。泛化=实现>组合>聚合>关联>依赖一个人(Person)可以买车(car)和房子(House),那么就可以称:Person类依赖于Car类...

    管理系统javasal源码-Design-Patterns-Demo:超全的设计模式——理论+实现demo

    Pattern)单例模式(Singleton Pattern)建造者模式(Builder Pattern)原型模式(Prototype Pattern) 2 结构型模式:这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 ...

    软件设计模式大作业

    java设计模式期末大作业,运用了6种模式,包括简单工厂模式、工厂方法模式、单例模式、门面模式、策略模式、观察者模式,文档包括系统流程,系统类图,各个模式的子类图,源代码,实验截图。绝对完整.

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    设计模式Demo

    创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:...

    java——让学员少走弯路

    Java的一些基本概念,Java的起源、为什么我们要学习Java语言,Java跨平台原理剖析;Java环境变量的配置,初学者常犯的问题,...数组的复制与排序,Runtime类与Process类,Class类与反射API,Runtime类与单例设计模式。

    java高手真经 (UML建模+设计模式+面向服务架构) 卷3

    pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 pattern/src/structure/adapter //12.1适配器模式 pattern/src...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷1

    pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者模式 pattern/src/creation/prototype //11.5原型模式 pattern/src/structure/adapter //12.1适配器模式 pattern/src...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷9

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

Global site tag (gtag.js) - Google Analytics