My Personal Time

Desire is the starting point of all achievement

0%

单例模式

单例模式:

from 《菜鸟教程》

是属于创建型模式,提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,这个类负责创建自己的对象,同时也只有单个对象被创建,这个类提供了一个访问其唯一对象的方法,同时不需要实例化就可以直接访问。

  1. 单例类只能有一个实例
  2. 单例类必须自己创建自己的唯一实例
  3. 单例类必须给所有其他对象提供该实例
单例与静态类
  1. 单例可以继承和被继承,方法可以被重写,而静态方法不可以
  2. 静态方法中产生的对象会在执行后被释放,进而被GC清理,不会一直存在内存中
  3. 静态类会在第一次运行时候初始化,单例模式可以延迟加载
懒汉式,线程不安全

Lazy初始化,非多线程

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

}
懒汉式,线程安全

Lazy初始化,多线程

1
2
3
4
5
6
7
8
9
10
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
饿汉式

非Lazy初始化,多线程,类加载时就初始化

1
2
3
4
5
6
7
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance()[
return instance;
]
}
双检锁
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Singleton{
private volatile static Singleton singleton;
private Singleton(){}
public static Singleton getSingleton(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
登记式
1
2
3
4
5
6
7
8
9
public class Singleton{
private static class SingletonHolder{
private static final Singleton INSTANCE = new Singleton();
}
private Singleton(){}
public static final Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
枚举
1
2
3
4
5
6
public enum Singleton{
INSTANCE;
public void whateverMethod(){

}
}