一、什么是单例模式
单利模式就是单利对象的类只允许一个实例存在。
二、单利模式的应用场景
三、单利模式的优缺点
四、实现单例模式
1. 饿汉式
顾名思义很饿、这种模式下只要类被jvm加载了就会实例化好对象,并且线程是安全的、应是在类只会加载一次。
优点:线程安全
缺点:加载就创建、如果一直不用的时候会浪费内存。
public class Singleton {
private static Singleton instance = new Singleton();
// 私有构造方法防止外部实例化
private Sinleton(){
}
// 通过getInstance获得单利对象
public static Singleton getInstance(){
return instance;
}
}
2. 懒汉式
很懒、用的时候才创建对象。但在创建对象的时候由于存在你并发问题线程不安全、会创建多个实例。
优点:用的时候再加载、节省内存
缺点:线程不安全
public static Singleton {
private static Singleton instance;
// 构造方法私有化、不让外部类new对象
private Singleton(){}
// 通过getInstace获得对象
public Singleton getInstance(){
// 判断是否已创建
if(instance == null){
instance = new Singleton();
}
return instace;
}
}
3. 加锁实现线程安全的懒汉式单利
我们可以在懒汉模式基础下在他的getInstance方法上synchronized这样会保证线程的安全但是每次不管有没有创建好都走锁明显是效率很低的,所以我们可以先判断是否为空、为空就走判断并且判读是加了锁的。这样既能保证较高的效率又能保证线程的安全。
public class Singleton {
private static Singleton instance;
// 私有化构造方法、不让外部构造
private Singleton(){}
// 通过getInstace获得对象
private static Singleton getInstace(){
if (instance == null){
// 锁类
synchronized (Singleton.class){
if (instance == null){
return instance = new Singleton();
}
}
}
return instance;
}
}