JAVA设计模式-单例模式(Singleton)的五种实现方式
2017-10-10 14:42
726 查看
单例(Singleton)模式 也叫单态模式
我在另一篇文章中已经介绍过了过关于单例模式的简单描述和优缺点,感兴趣的朋友可以点击下面的连接,在这里我就不在赘述。单例模式(Singleton)应用场景和优缺点
本篇文章主要介绍单例模式常见的5种实现方式,分别是:懒汉式、饿汉式、双重检测锁式、静态内部类式和枚举单例。下面我将为大家逐个介绍他们的特点和实现方式。
饿汉式(线程安全、调用效率高、不能延时加载)
package com.ph.gof23.singleton; /** * 测试饿汉式单例模式 * 特点:线程安全、调用效率高、不能延时加载 * 缺点:如果当该类加载很费时间且从未被调用时会造成资源的浪费 * @author PangHao * @param instance 类初始化时立即加载的对象 * */ public class SingletonDemo01 { //static变量会在类加载时初始化,此时不会出现多个线程访问该对象的问题,虚拟机只加载一次该类(天然线程安全) public static /*final*/ SingletonDemo01 instance=new SingletonDemo01(); //类初始化时立即加载该对象 //方法没有同步调用效率高 public static SingletonDemo01 getInstance(){ return instance; } //私有构造器 private SingletonDemo01() { // TODO Auto-generated constructor stub } }
懒汉式(线程安全、调用效率不高、可以延时加载)
package com.ph.gof23.singleton; /** * 测试懒汉式单例模式 * 特点:线程安全、调用效率不高、可以延时加载 * 缺点:如果该类加载很费时间当初次调用时加载速度慢,且由于访问方法加锁,所以当多个线程访问时需要等待 * @author PangHao * @param instance 单例对象 * */ public class SingletonDemo2 { public static SingletonDemo2 instance; //声明但不创建 //加锁保证线程安全(调用效率不高) public static synchronized SingletonDemo2 getInstance(){ if(instance==null){ instance=new SingletonDemo2();//在用的时候创建 } return instance; } //私有构造器 private SingletonDemo2() { // TODO Auto-generated constructor stub } }
*静态内部类式(线程安全、调用效率高、可以延时加载)
package com.ph.gof23.singleton; /** * 测试静态内部类式单例模式 * 特点:线程安全、调用效率高、可以延时加载 * 优点:综合了懒汉饿汉的优点 * @author PangHao * @param instance 单例对象 * */ public class SingletonDemo4 { //静态内部类(类加载时静态内部类并不会立即初始化实现延时加载) private static class SingletonClassInstance{ //线程安全 private static final SingletonDemo4 instance=new SingletonDemo4(); } public static SingletonDemo4 getInstance(){ return SingletonClassInstance.instance; } //私有构造器 private SingletonDemo4() { // TODO Auto-generated constructor stub } }
枚举单例式(线程安全、调用效率高、不能延时加载)
package com.ph.gof23.singleton; /** * 测试枚举式单例模式 * 特点:实现简单,枚举本身单例,避免反射、反序列化漏洞 * 缺点:不能延时加载 * @author PangHao * @param INSTANCE 单例对象 * 该类为枚举类 */ public enum SingletonDemo5 { //创建一个枚举元素,代表一个单例实例 INSTANCE; //功能方法 public void SingletonOperation(){ //operation } }
双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题,不建议使用)
package com.ph.gof23.singleton; /** * 测试双重检测锁式单例模式 * 特点:不必每次获取对象时都进行同步 * 缺点:由于JVM底层内部模型原因,偶尔会出问题,不建议使用 * @author PangHao * @param instance 单例对象 * */ public class SingletonDemo3 { public static SingletonDemo3 instance=null; public static SingletonDemo3 getInstance(){ if(instance==null){ SingletonDemo3 sc; synchronized (SingletonDemo3.class) { sc=instance; if(sc==null){ synchronized (SingletonDemo3.class) { if(sc==null){ sc=new SingletonDemo3(); } } instance=sc; } } } return instance; } //私有构造器 private SingletonDemo3() { // TODO Auto-generated constructor stub } }
相关文章推荐
- 设计模式:单例模式(Singleton) java实现及实现方式对比
- 设计模式之单例模式 (五种单例模式实现方式) 并利用CountDownLatch类在多线程下比较效率
- 架构设计之设计模式 (四) Java中多种方式实现单例模式
- Java设计模式(二):单例模式的5种实现方式,以及在多线程环境下5种创建单例模式的效率
- 设计模式之—单例模式(Singleton)-Java实现
- 五种方法实现Java的Singleton单例模式
- 五种方法实现Java的Singleton单例模式
- 安卓设计模式之单例模式的五种实现方式
- JAVA中单例模式实现的五种方式,有详细的比较
- ANDROID设计模式之单例模式的五种实现方式
- 架构设计之设计模式 (四) Java中多种方式实现单例模式
- java设计模式之单例模式的四种实现方式
- JAVA设计模式——单例(Singleton)模式 多种实现方法
- Rhyme/设计模式之单例模式详解—作用、应用场景、优点、五种单例模式实现方式
- java设计模式学习笔记5 适配器模式几种实现方式
- [Java设计模式](一)怎样实现Singleton(单例)模式编程
- Java 实现工厂设计模式的三种方式
- 设计模式之生产者消费者模式的多种实现方式(java)
- 设计模式之—单例模式(Singleton)-Java实现
- Java设计模式偷跑系列(六)Singleton模式的建模与实现