Java中的五种单例模式



Java模式之单例模式:
单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:

  • 1,一个类只能有一个实例
    • 2 自己创建这个实例
    • 3 整个系统都要使用这个实例

例: 在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。


Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。一些资源治理器经常设计成单例模式。


外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当集中治理这些通信端口,以避免一个通信端口被两个请求同时调用。内部资源,譬如,大多数的软件都有一个(甚至多个)属性文件存放系统配置。这样的系统应当由一个对象来治理这些属性文件。一个例子:Windows 回收站。


在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。 两种形式:

package singleton;  

/**
 * @author lei
 * 单例模式的五种写法:
 * 1、懒汉
 * 2、恶汉
 * 3、静态内部类
 * 4、枚举
 * 5、双重校验锁
 * 2011-9-6
 */
/**
 *五、 双重校验锁,在当前的内存模型中无效
 */
class LockSingleton{
        private volatile static LockSingleton singleton;
        private LockSingleton(){}  

        //[详细](http://www.ibm.com/developerworks/cn/java/j-dcl.html)
        public static LockSingleton getInstance(){
            if(singleton==null){
                synchronized(LockSingleton.class){
                    if(singleton==null){
                        singleton=new LockSingleton();
                    }
                }
            }
            return singleton;
        }  

    }  
/**
 * 四、枚举,《Effective Java》作者推荐使用的方法,优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象
 */
 enum EnumSingleton{
        INSTANCE;
        public void doSomeThing(){
        }
    }  
/**
 * 三、静态内部类 优点:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到Lazy loading
 */
class InternalSingleton{
        private static class SingletonHolder{
            private final static  InternalSingleton INSTANCE=new InternalSingleton();
        }
        private InternalSingleton(){}
        public static InternalSingleton getInstance(){
            return SingletonHolder.INSTANCE;
        }
    }  
/**
 * 二、恶汉,缺点:没有达到lazy loading的效果
 */
class HungrySingleton{
        private static HungrySingleton singleton=new HungrySingleton();
        private HungrySingleton(){}
        public static HungrySingleton getInstance(){
            return singleton;
        }
    }  
/**
 * 一、懒汉,常用的写法
 */
 class LazySingleton{
        private static LazySingleton singleton;
        private LazySingleton(){
        }
        public static LazySingleton getInstance(){
            if(singleton==null){
                singleton=new LazySingleton();
            }
            return singleton;
        }
    } 
时间: 2024-10-02 23:57:47

Java中的五种单例模式的相关文章

聊聊Java中的四种单例模式

近期在做支付,一开始图省事,也是为了调试方便,支付的alipayClient和tradeService都是使用的时候去拿,这样就会导致创建多次.为了节省资源,统一配置成单例模式. 什么是单例 Singleton(单例)是设计模式的一种,为了保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例特点 单例类确保自己只有一个实例(构造函数私有:不被外部实例化,也不被继承). 单例类必须自己创建自己的实例. 单例类必须为其他对象提供唯一的实例. 单例应用 资源管理器,回收站,打印机资源,线程池,

在容器中使用Java RAM:五种不丢失内存的方法

本文讲的是在容器中使用Java RAM:五种不丢失内存的方法[编者的话]在这篇文章中,我们想分享一些看起来不那么明显的关于在容器内部中Java内存管理和弹性扩展的细节. 您将看到在即将发布的JDK版本中需要注意的问题和重要更新的列表,以及核心难点的现有解决方法. 我们收集了可以提高Java应用程序的资源使用效率的五个最有趣和最有用的问题点. [3 天烧脑式 Docker 训练营 | 上海站]随着Docker技术被越来越多的人所认可,其应用的范围也越来越广泛.本次培训我们理论结合实践,从Docke

SQL中的五种数据类型

数据|数据类型 简要描述一下SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型 字符型 VARCHAR VS CHAR VARCHAR型和CHAR型数据的这个差别是细微的,但是非常重要.他们都是用来储存字符串长度小于255的字符. 假如你向一个长度为四十个字符的VARCHAR型字段中输入数据Bill Gates.当你以后从这个字段中取出此数据时,你取出的数据其长度为十个字符--字符串Bill Gates的长度. 现在假如你把字符串输入一个长度为四十个字符的CHAR型字段中,那么当你取

java中,哪种情况hashcode一样,但是equal却不一定相等

问题描述 java中,哪种情况hashcode一样,但是equal却不一定相等 hashcode一样,内存地址应该也一样,那么说明是一样的对象或者变量,那为什么还要说,先判断hashcode是否一样,如果一样了,再去判断equal,用来确定不一样的结果 解决方案 考虑一种极端情况,如果你的程序有多于2^32个对象,无论你的hash算法是什么,显然用int表示hashcode肯定有重复. 解决方案二: 因为hash code是通过哈希函数来映射的,肯定会出现两个不同key的hash值相同,这就是哈

浅谈Java中的n种随机数产生办法_java

我们从书本上学到什么? 最明显的,也是直观的方式,在Java中生成随机数只要简单的调用: java.lang.Math.random() 在所有其他语言中,生成随机数就像是使用Math工具类,如abs, pow, floor, sqrt和其他数学函数.大多数人通过书籍.教程和课程来了解这个类.一个简单的例子:从0.0到1.0之间可以生成一个双精度浮点数.那么通过上面的信息,开发人员要产生0.0和10.0之间的双精度浮点数会这样来写: Math.random() * 10 而产生0和10之间的整数

浅谈Java中的四种引用方式的区别_java

强引用.软引用.弱引用.虚引用的概念 强引用(StrongReference) 强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object和str都是强引用: Object object = new Object(); String str = "hello"; 只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象. 比如下面这段代码: public class Main { publi

python中的五种异常处理机制介绍_python

从几年前开始学习编程直到现在,一直对程序中的异常处理怀有恐惧和排斥心理.之所以这样,是因为不了解.这次攻python,首先把自己最畏惧和最不熟悉的几块内容列出来,里面就有「异常处理」这一项. <Dive into Python>并没有专门介绍异常处理,只是例子中用到的时候略微说明了一下.今天下载<Learn Python>,直接进异常处理这块.这一部分有四章,第一章讲解异常处理的一般使用方法,后面的章节深入地讨论其机制.我目前只看了第一章,先学会用,以后有必要的时候再扩展阅读. p

探究JavaScript中的五种事件处理程序方式_javascript技巧

我们知道JavaScript与HTML之间的交互是通过事件实现的.事件最早是在IE3和Netscape Navigator 2中出现的,当时是作为分担服务器运算负载的一种手段. 通俗地理解,事件就是用户或浏览器自身执行的某种操作.而事件处理程序即为响应某个事件的函数.抽出主干,即事件处理程序为函数.  我们又把事件处理程序称为事件侦听器.  事件处理程序是以"on"开头的,因此对于事件on的时间处理程序即为onclick.时间处理程序在JavaScript中大致有五种,下面会根据这五种

javascript中的五种基本数据类型_javascript技巧

[0]5种数据类型:     [0.1]基本数据类型:Undefined.Null.Boolean.Number.String         [0.1.1]基本类型值是指简单的数据段,5种基本类型是按值访问的,因为可以操作保存在变量中的实际值         [0.1.2]基本类型的值在内存中占据固定大小的空间,被保存在栈内存中.从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本.         [0.1.3]不能给基本类型的值添加属性     [0.2]引用数据类型:Objec