1. 饿汉式单例模式
总结: 在类加载的时候就已经把对象创建好了
/*************************************************************************
> File Name: EagerSingleton.java
> Author:
> Mail:
> Created Time: Sat 02 Jun 2018 12:47:09 AM PDT
************************************************************************/
package indi.tlq.singleton;
public class EagerSingleton{
private static EagerSingleton instance = new EagerSingleton();
private EagerSingleton(){}
public static EagerSingleton getInstance(){
return instance;
}
}
2.懒汉式单例模式
总结:同步静态函数中创建对象
/*************************************************************************
> File Name: LazySingleton.java
> Author:
> Mail:
> Created Time: Sat 02 Jun 2018 12:59:12 AM PDT
************************************************************************/
package indi.tlq.singleton;
public class LazySingleton{
private static LazySingleton instance = null;
private LazySingleton(){};
public static synchronized LazySingleton getInstance(){
if(instance == null){
instance = new LazySingleton();
}
return instance;
}
}
3双锁检测单例模式
总结: volatile变量 + 两次判断 + 第二次判断需要同步
/*************************************************************************
> File Name: Singleton.java
> Author:
> Mail:
> Created Time: Sat 02 Jun 2018 01:07:54 AM PDT
************************************************************************/
package indi.tlq.singleton;
public class Singleton{
// volatile 变量的意思是每次获取instance都是充主内存中获取最新的值
private static volatile Singleton instance = null;
// 私有构造函数,其他类不能使用new来创建该对象
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
4 私有静态内部类单例模式
总结: 只要不使用静态内部类的时候,内部类是不会加载到内存中的
/*************************************************************************
> File Name: Singleton2.java
> Author:
> Mail:
> Created Time: Sat 02 Jun 2018 01:22:01 AM PDT
************************************************************************/
package indi.tlq.singleton;
public class Singleton2{
private Singleton2(){}
// 静态内部类
private static class SingletonInner{
private static Singleton2 instance = new Singleton2();
}
public static Singleton2 getInstance(){
return SingletonInner.instance;
}
}