1.定义
1)单例类只能有一个实例;
2)单例类构造方法为私有方法,必须自己创建自己的唯一实例;
2.应用场景
1)工具类对象;
2)创建对象耗时过多或耗费的资源过多,但又经常用到的对象
3.单例模式的实现
1)饿汉模式
class Singleton{
private Singleton(){}
private static Singleton singleton=new Singleton();
public Singleton getInstance(){
return singleton;
}
}
class Singleton2{
private Singleton2(){}
private static Singleton2 singleton2;
static{
singleton2=new Singleton2();
}
}
使用静态变量和静态块实现的单例模式,在类加载时便会创建,如果不使用会造成资源浪费
2)懒汉模式(延迟加载)
class Singleton3{
private Singleton3(){}
private Singleton3 singleton3;
public synchronized Singleton3 getInstance(){
if(singleton3==null){
singleton3=new Singleton3();
}
return singleton3;
}
}
使用synchronized内置锁实现的单例模式都是现成安全的,synchronized修饰的同步方法效率较低
class Singleton4{
private Singleton4(){}
private volatile Singleton4 singleton4;
public Singleton4 getInstance(){
if(singleton4==null){
synchronized(Singleton4.class){
if(singleton4==null){
singleton4=new Singleton4();
}
}
}
return singleton4;
}
}
使用双重校验锁实现的单例模式,效率高,推荐使用;
class Singleton5{
private Singleton5(){}
private static class SingletonInstance{
private static final Singleton5 instance=new Singleton5();
}
public static Singleton5 getInstance(){
return SingletonInstance.instance;
}
}
使用静态内部类实现,静态内部类只有在第一次使用时才会加载,同时创建实例,延迟加载,同时是线程安全的;