设计模式--单例模式

转载 2018年04月17日 10:30:38

1.恶汉式:静态常量

    单例的实例被声明称static和final,在类加载到内存的就是就被初始化了,同时也是线程安全

public class Singleton1 {  
  
    private final static Singleton1 instance = new Singleton1();  
    private Singleton1(){}  
    public static Singleton1 getInstance(){  
        return instance;  
    }  

       缺点:不是懒加载,单例会在类加载后就会被初始化,即使没有调用getInstance方法。在一些场景中将无法使用:比如Singleton实例的创建是依赖参数或者配置文件的,在getInstance()之前必须调用某个方法设置参数给它,那么单例写法就无法使用了。


2.懒汉式:线程不安全

public class Singleton2 {  
      
    private static Singleton2 instance ;  
    private Singleton2(){}  
    public  static Singleton2 getInstance(){  
        if(instance == null){  
            instance = new Singleton2();  
        }  
        return instance;  
    }  
}  

缺点:多线程并行调用getInstance的时候不能正常工作(存在线程安全问题)

3.懒汉式:线程安全

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

 --虽然做到了线程安全,但是并不高效。

4.懒汉式:静态内部类(推荐)

public class Singleton5 {  
  
    private static class SingletonHandler{  
        private static final Singleton5 INSTANCE = new Singleton5();  
    }  
    private Singleton5(){}  
    public static Singleton5 getInstance(){  
        return SingletonHandler.INSTANCE;  
    }  

--读取实例的时候不会进行同步,没有性能缺陷,也不依赖JDK版本。

5.双重校验锁(推荐

可能会有多个线程一起进入同步块外的if,如果在同步块内不进行二次检验的话就会生成多个实例了。

public class Singleton6 {  
      
    private static Singleton6 instance;  
    private Singleton6(){}  
    public static Singleton6 getSingleton6(){  
        if(instance==null){  
            synchronized(Singleton6.class){  
                if(instance==null){  
                   instance = new Singleton6();  
                }  
            }  
        }  
        return instance;  
    }  
public class Singleton6 {  
      
    private volatile static Singleton6 instance;  
    private Singleton6(){}  
    public static Singleton6 getSingleton6(){  
        if(instance==null){  
            synchronized(Singleton6.class){  
                if(instance==null){  
                   instance = new Singleton6();  
                }  
            }  
        }  
        return instance;  
    }  

    --线程安全但效率低

6.枚举

public class Singleton7 {  
  
    public enum EasySingleton{  
        INSTANCE;  
    }  
}  

--创建枚举默认就是线程安全,而且还能防止反序列化导致重新创建新的对象。可直接通过EasySingleton.INSTANCE来访问。


参考:bingogirl博文




设计模式之单例模式详解与应用

-
  • 1970年01月01日 08:00

设计模式之单例模式

  • 2017年12月01日 17:54
  • 9KB
  • 下载

调侃《Head First 设计模式》之单例模式

对于一个类来说,平常我们可以随便new出无限多个对象(只要内存hold得住),但是像线程池、缓存、对话框、日志对象、设备驱动程序的对象只能有一个对象,如果制造多个实例就会出现问题。比如程序行为异常,资...
  • sinat_23092639
  • sinat_23092639
  • 2015-04-25 11:02:27
  • 730

Java设计模式之一 单例设计模式

设计模式: 设计模式的概念首先来源于其它行业:建筑业,在早起建房子的时候,肯定是经验缺乏、显得杂乱无序的,这就会造成很多问题,在行业发展过程,通过不断的经验积累,前辈们针对这些问题提出了合理解决方案...
  • qq_32736689
  • qq_32736689
  • 2016-04-07 08:29:45
  • 2554

设计模式(二)单例模式的七种写法

面试的时候,问到许多年轻的Android开发他所会的设计模式是什么,基本上都会提到单例模式,但是对单例模式也是一知半解,在Android开发中我们经常会运用单例模式,所以我们还是要更了解单例模式才对。...
  • itachi85
  • itachi85
  • 2016-01-17 10:29:15
  • 25012

设计模式:这是最全面 & 详细的 单例模式(Singleton)分析指南

前言 今天我来全面总结一下Android开发中最常用的设计模式 - 单例模式。 关于设计模式的介绍,可以看下我之前写的:1分钟全面了解“设计模式” 目录 1. 实例引入...
  • carson_ho
  • carson_ho
  • 2016-08-16 17:15:07
  • 4633

研磨设计模式之单例模式.pdf

  • 2011年11月16日 15:06
  • 311KB
  • 下载

GOF 23种设计模式 创建类模式 (1) 单例模式

定义 : 确保一个雷只有一个实例,而且自行实例化并想整个系统提供这个实例 类型 : 创建类模式  类图 :  类图知识点 :  1 类图分为三个部分,依次为 类名 属性...
  • wuming0108
  • wuming0108
  • 2014-08-10 16:26:02
  • 392

java设计模式之单例模式5种方法及优缺点小结

单例设计模式的用处。单例设计模式是指,某个类只有一个实例。在计算机系统中类似于打印机和最常见的就是任务管理器的对话框,不管几个用户同时登录windows 打开的任务对话框只有一个。常见的几种实现方式:...
  • gwbbigbang
  • gwbbigbang
  • 2017-06-04 18:27:09
  • 488

设计模式系列(一)单例模式

一、简单介绍 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。 《设计模式》书中对单例模式动机的介绍 对于系统中的某些类...
  • robertcpp
  • robertcpp
  • 2016-06-05 11:00:42
  • 3634
收藏助手
不良信息举报
您举报文章:设计模式--单例模式
举报原因:
原因补充:

(最多只允许输入30个字)