Java单例模式

Wesley13
• 阅读 497

什么是单例模式

  单例模式是在程序中,一个类保证只有一个实例,并提供统一的访问入口。

为什么要用单例模式

  • 节省内存 节省计算

  • 如对象实例中的一样的,那就不用每次都创建一个对象

  • 方便管理

    • 因为单例提供一个统一的访问入口,不需要创建N多个对象,很多工具类都用了单例实现,如日志、字符串工具类
  • 保证结果正确

    • 比如统计网站的访问次数等等

单例的实现方式

  • 饿汉式

    • 程序启动的时候就会实例化

    1 public class Singleton { 2
    3 private static Singleton singleton = new Singleton(); 4
    5 private Singleton(){} 6
    7 public static Singleton getInstance(){ 8 return singleton; 9 } 10 }

  饿汉静态代码块形势

 1 public class Singleton {
 2 
 3     private static Singleton singleton;
 4     static {
 5         singleton = new Singleton();
 6     }
 7     private Singleton(){}
 8 
 9     public static Singleton getInstance(){
10         return singleton;
11     }
12 }
  • 懒汉式

    • 非线程安全的实现

    1 public class Singleton { 2 3 private static Singleton singleton; 4 private Singleton(){} 5 6 public static Singleton getInstance(){ 7 if (singleton == null){ 8 return singleton = new Singleton(); 9 } 10 return singleton; 11 } 12 }

    • 线程安全的实现,单性能低

    1 public class Singleton { 2 3 private static Singleton singleton; 4 private Singleton(){} 5 6 public static synchronized Singleton getInstance(){ 7 if (singleton == null){ 8 return singleton = new Singleton(); 9 } 10 return singleton; 11 } 12 }

    • 线程安全的实现,双重校验
      • 注意:两个校验都必须加,如果第二个没有加校验,当两个线程都通过了第一个if校验,此时会有一个线程进入同步代码块,创建singleton实例,接着第二个线程也会进入同步代码块,并会在创建一个singleton。那么这样就破坏了单例。如果不加第一个if校验,那么所有的程序就会串行执行,影响执行效率。所以两个校验都必须存在

    1 public class Singleton { 2 /**由于 return singleton = new Singleton(); 这行代码在JVM中会分为三步处理 3 * 1.给singleton分配内存空间 4 * 2.调用singleton的构造函数开初始化 5 * 3.将singleton对象指向分配的内存空间(这步执行了就singleton就不是null了) 6 * 7 * 由于CPU会对这三个步骤重排序,如果顺序是1 3 2,那么就可能出现singleton就不是空的,但并没有初始化singleton 8 * 这样第二个线程可能拿到的就是为初始化的singleton,所以使用volatile来修饰singleton,防止重排序的问题 9 */ 10 private static volatile Singleton singleton; 11 private Singleton(){} 12 13 public static Singleton getInstance(){ 14 if (singleton == null){ 15 synchronized (Singleton.class) { 16 if (singleton == null) { 17 return singleton = new Singleton(); 18 } 19 } 20 } 21 return singleton; 22 } 23 }

    • 懒汉之静态内部类的方式
      • 这种方式能保证线程的安全线性,当Singleton被装载时,并不会立刻实例化静态内部类SingletonInstance,而是在需要时才会实例化

    1 public class Singleton { 2
    3 private static class SingletonInstance{ 4 private static final Singleton singleton = new Singleton(); 5 } 6 private Singleton(){} 7 8 public static Singleton getInstance(){ 9 return SingletonInstance.singleton; 10 } 11 }

  • 枚举实现单例

    • 实现简单、线程安全、可以防止反序列化、反射的方式破坏单例模式,如果通过反序列化或反射的方式创建实例,会抛出异常。这种方式是最好的实现的方式

    1 public enum Singleton{ 2 INSTANCE; 3 public void whateverMethod(){ 4 }
    5 }

点赞
收藏
评论区
推荐文章
3A网络 3A网络
1年前
Golang 常见设计模式之单例模式
之前我们已经看过了Golang常见设计模式中的装饰和选项模式,今天要看的是Golang设计模式里最简单的单例模式。单例模式的作用是确保无论对象被实例化多少次,全局都只有一个实例存在。根据这一特性,我们可以将其应用到全局唯一性配置、数据库连接对象、文件访问对象等。Go语言实现单例模式的方法有很多种,下面我们就一起来看一下。饿汉式饿汉式实现单例模式非
Wesley13 Wesley13
2年前
java设计模式1
1:单例模式简介  单例模式是一种常用的软件设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供唯一的实例。总而言之就是在系统中只会存在一个对象,其中的数据是共享的  特点:    单例类只能有一个实例,所以一般会用static进行修释。    单例类必须自己创建自己的唯一实例。也就是在类中要new一个自己。    单例类必
红烧土豆泥 红烧土豆泥
3年前
创建型模式之单例设计模式
什么是单例设计模式?顾名思义,只有一个实例。单例模式它主要是确保一个类只有一个实例,并且可以提供一个全局的访问点。废话少说,直接上干货了单例模式之饿汉式所谓饿汉式,顾名思义,“它很饿”。所以说,它一旦被加载进来,就会直接实例化一个对象。例如:languageclassSingleton{privatestaticfin
Wesley13 Wesley13
2年前
java 23种设计模式(五、单例模式)
作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。单例模式的结构  单例模式的特点:单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。  饿汉式单例类publicclassEagerSingleton
Wesley13 Wesley13
2年前
JAVA设计模式之单例设计模式
    单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。  在JAVA中实现单例,必须了解JAVA内存机制,JAVA中实例对象存在于堆内存中,若要实现单例,必须满足两个条件:  1.限制类实例化对象。即只能产生一个对象。
Wesley13 Wesley13
2年前
PHP单例模式(精讲)
首先我们要明确单例模式这个概念,那么什么是单例模式呢?单例模式顾名思义,就是只有一个实例。作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类我们称之为单例类。单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例
Stella981 Stella981
2年前
C#设计模式(1)——单例模式(Singleton)
单例模式即所谓的一个类只能有一个实例,也就是类只能在内部实例一次,然后提供这一实例,外部无法对此类实例化。单例模式的特点:1、只能有一个实例;2、只能自己创建自己的唯一实例;3、必须给所有其他的对象提供这一实例。普通单例模式(没有考虑线程安全)  ///<summary///单例模式
Wesley13 Wesley13
2年前
(面试常问)4种单例设计模式的总结(内含代码以及分析)
单例设计模式:  单例模式,是一种常见的软件设计模式.在它的核心结构中只包含了一个被称为单例的特殊类.通过单例模式可以保证系统中只有该类的一个实例对象.优点:  实例控制:单例模式会阻止其它对象实例化其自己的单例对象的副本,从而确保所有对象都访问的是唯一的实例   灵活性:因为类控制了实例化过程,所以类可以很灵活的更改实
Wesley13 Wesley13
2年前
Java设计模式:Singleton(单例)模式
概念定义Singleton(单例)模式是指在程序运行期间,某些类只实例化一次,创建一个全局唯一对象。因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式。单例模式主要是为了避免创建多个实例造成的资源浪费,以及多个实例多次调用容易导致结果出现不一致等问题。例如,一个系统只能有一个窗口管理器或文件系统,一个程
Wesley13 Wesley13
2年前
23种设计模式(1):单例模式
定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。类型:创建类模式类图:!23种设计模式(1):单例模式第1张|快课网(http://static.oschina.net/uploads/img/201407/05200605_0dij.gif"23种设计模式(1):单例模式