1、首先什么是设计模式?
设计模式是为了解决特定问题并经过实践验证而得出的一套模式。
2、什么是单例模式?
顾名思义,单例就是在整个过程中只创建了一个实例。
3、单例模式可以分为 懒汉模式 和 饿汉模式 以及 静态内部类单例模式 。
- 懒汉模式(线程安全)
/**
*
* 懒汉模式
* - 线程安全
*
* 这种写法能够在多线程中很好的工作,但每次调用getInstance方法时都需要进行同步,
* 这会造成不必要的同步开销,而且大部分时候我们是用不到同步的。所以不建议用这种模式。
* */
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public synchronized static Singleton getInstance(){
if(null == instance){
instance = new Singleton();
}
return instance;
}
}
- 懒汉模式(线程不安全)
/**
*
* 懒汉模式
* - 线程不安全
*
* 懒汉模式声明了一个静态对象,在用户第一次调用的时候初始化。
* 这虽然节约了资源,但第一次加载时需要实例化,反应稍微慢一些,而且在多线程时不能正常工作。
*/
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance(){
if(null == instance){
instance = new Singleton();
}
return instance;
}
}
- 饿汉模式
/**
*
* 饿汉模式
*
* 1、这种方式在类加载时就完成了初始化,所以类加载较慢,但获取对象速度快。
* 2、这种方式基于类加载机制,避免了多线程的同步问题。
* 3、在类加载的时候就完成了实例化,没有达到懒加载的效果。
* 4、如果从始至终未使用过这个实例,则会造成内存的浪费。
*/
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance(){
return instance;
}
}
- 静态内部类单例模式
* 静态内部类单例模式
*
* 第一次加载Singleton类时并不会初始化sInstance,
* 只有第一次调用getInstance方法时虚拟机加载SingletonHolder并初始化sInstance。
* 这样不仅能保证线程安全,也能保证Singleton类的唯一性。所以,推荐使用静态内部类单例模式。
*/
public class Singleton {
private Singleton() {
}
public static final Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder{
private static final Singleton INSTANCE = new Singleton();
}
}