单例模式:
- 确保类中只有一个实例,使用一个私有构造函数、私有静态变量以及一个公有静态函数来实现。
- 私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量
1.饿汉式
- 类加载到内存后,就实例化一个单例,JVM保证线程安全
- 缺点:不管用到与否,类加载时完成实例化
public class Singleton {
private static final Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
2.懒汉式
2.1线程不安全写法
- 使用时再实例化,节约资源
- 缺点:多线程情况下不安全
public class Singleton{
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
2.2双重检查
- 先判断 singleton是否已经被实例化,如果没有被实例化,然后才对实例化语句进行加锁
public class Singleton{
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton==null){
synchronized(Singleton.class){
if(singleton==null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
2.3静态内部类写法
- 静态内部类形式
- JVM保证单例,加载外部类时不会加载内部类,可以实现懒加载
public class Singleton{
private Singleton(){}
private static class Handle{
private static final Singleton singleton= new Singleton();
}
public static Singleton getInstance(){
return Handle.singleton;
}
}



