难得放假,闲来无事的我终于又有了点空闲时间来整理下一直以来没空整理的资料了,今天带来的是对我们开发中一定会用到的单例模式的学习整理
首先,我们要知道单例模式有五种实现方式
一、饿汉式
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton newInstance(){
return instance;
}
}
优点是:如果单例初始化速度比较快,占用内存非常小的时候用这种方式很合适
缺点是:如果单例初始化的操作耗时时间比较长而应用对启动速度又有要求或者占用内存比较大,再或者单例只在某个特定的场景下才会被使用,这时就不适合使用它了
二、懒汉式
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static Singleton newInstance(){
if(null == instance){
instance = new Singleton();
}
return instance;
}
}
优点是:单例的初始化操作在需要的时候才会执行(使用次数不是很多而且功能复杂时使用,可以减少大量内存的消耗)
缺点是:当执行单例的次数增多时,频繁的重复执行创建对象的操作会造成大量内存的消耗;同时,这个模式下,它的线程也是不安全的多个线程并发调用newInstance方法可能会创建多份相同的单例出来(解决方法就是使用同步锁,如三)
三、双重校验锁
public class Singleton{
private static volatile Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronized (Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
优点是:确保了线程的安全
四、静态内部类
public class Singleton{
//内部类,在装载该内部类时才会去创建单例对象
private static class SingletonHolder{
public static Singleton instance = new Singleton();
}
private Singleton(){}
public static Singleton newInstance(){
return SingletonHolder.instance;
public void doSomething(){
//do something
}
}
优点是:采用内部类,在这个内部类里面去创建对象实例。这样的话,只要应用中不使用内部类 JVM 就不会去加载这个单例类,也就不会创建单例对象,从而实现懒汉式的延迟加载和线程安全。
五、枚举类型
public enum Singleton{
//定义一个枚举的元素,它就是Singleton的一个实例
instance;
public void doSomething(){
//do something ...
}
}
使用方法如下:
public static void main(String[] args){
Singleton singleton = Singleton.instance;
singleton.doSomething();
}
优点是:枚举实例的创建是线程安全的(创建枚举类的单例在JVM层面也是能够保证线程安全的),而且实现方式简单
参考网址:https://blog.csdn.net/joeleedreamer/article/details/71717379