设计模式--单例模式

设计模式--单例模式

1.概述


1.1 定义

"Ensure a class has only one instance,and provide global point of access to it"(确保该类只有一个实例,而且想整个系统提供这个实例)

1.2 意义

由于单例模式在内存中只有一个实例对象,节约内存空间,减少了对象创建、GC时的系统消耗。

1.3 应用

单例模式(Singleston Pattern)经常能够在程序中看见,例如Spring框架中默认Bean为Singleton.

2.详解

注:以下代码都没有考虑反射强行创建对象。
单例模式的通用代码

 

 1 public class Singleton {
 2     // 静态的对象实例
 3     private static Singleton instance = new Singleton();
 4     // 静态方法获得该类的实例对象
 5     public static Singleton getInstance(){
 6         return instance;
 7     }
 8     // 私有的构造方法,避免其他类创建该类的对象。
 9     private Singleton(){}
10 }

 

有一点小小的问题:当我们访问该类的其他静态方法、静态域会造成该类的实例化,浪费内存空间。

~~~~~~~~~~~~~~~~~~~~~我是无聊的分割线~~~~~~~~~~~~~~~~~~~~

比上面好一点的单例模式

 1 public class Singleton {
 2     // 私有的构造方法,避免其他类创建该类的实例对象
 3     private Singleton(){}
 4     // 静态方法获得该类的实例对象
 5     public static Singleton getInstance(){
 6         return SingletonInstance.instance;
 7     }
 8     // 内部类初始化实例对象
 9     private static class SingletonInstance{
10         static Singleton instance = new Singleton();
11     }
12 }

~~~~~~~~~~~~~~~~~~~~~我是萌萌的分割线~~~~~~~~~~~~~~~~~~~~

差的单例模式

 1 public class Singleton {
 2     // 静态的实例对象
 3     private static Singleton instance;
 4     // 静态方法获得该类的实例对象
 5     public static Singleton getInstance(){
 6         if(instance == null){
 7             instance = new Singleton();
 8         }
 9         return instance;
10     }
11     // 私有的构造方法,避免其他类创建该类的实例对象
12     private Singleton(){}
13 }

问题:当高并发时,系统实际上会产生多了实例对象。如线程A执行到instance = new Single(),可能还没有获得对象(对象初始化需要时间)时,而线程B执行到instance == null判断为true继续创建新的实例对象。

原文地址:https://www.cnblogs.com/maying3010/p/6477141.html