单例模式

Posted 不痴不立

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。

设计模式

1. 单例模式:饱汉、饿汉。以及饿汉中的延迟加载,双重检查

单例模式

分类:懒汉式单例、饿汉式单例、登记式单例

特点:
  1、单例类只能有一个实例。
  2、单例类必须自己自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例

应用场景:线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例

 懒汉式,线程不安全
1
public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 5 public static Singleton getInstance() { 6 if (instance == null) { 7 instance = new Singleton(); 8 } 9 return instance; 10 } 11 } 懒汉式,线程安全,不高效 13 public static synchronized Singleton getInstance() { 14 if (instance == null) { 15 instance = new Singleton(); 16 } 17 return instance; 18 }

双重检查锁模式

 1 public class Singleton {
 2     private volatile static Singleton instance; //声明成 volatile
 3     private Singleton (){}
 4 
 5     public static Singleton getSingleton() {
 6         if (instance == null) {                         
 7             synchronized (Singleton.class) {
 8                 if (instance == null) {       
 9                     instance = new Singleton();
10                 }
11             }
12         }
13         return instance;
14     }
15    
16 }

饿汉式

 1 public class Singleton{
 2     //类加载时就初始化
 3     private static final Singleton instance = new Singleton();
 4     
 5     private Singleton(){}
 6 
 7     public static Singleton getInstance(){
 8         return instance;
 9     }
10 }

静态内部类的写法(推荐)懒汉式

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

Singleton通过将构造方法限定为private避免了类在外部被实例化

完美的解释http://wuchong.me/blog/2014/08/28/how-to-correctly-write-singleton-pattern/

 

以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块