Java 单例模式

什么是单例模式?

  单例模式指的是 一个类 只产生 一个实例化对象

目的(作用):

  保证在Java应用程序中,一个类Class只有一个实例存在。

 

常见的模式:


 

  饿汉模式

  实现代码:

public class SingleDemo0 {

    private static SingleDemo0 singleDemo0 = new SingleDemo0();

    private SingleDemo0(){}

    public static SingleDemo0 getInstance(){
        return singleDemo0;
    }

    public static void main(String[] args) {
        
        // 通过 静态方法取出 实例对象
        SingleDemo0 singleDemo0 = getInstance();
        System.out.println(singleDemo0);
    }
    
}

  优点:

    1、仅实例化一次

    2、线程是安全的

    3、获取实例速度快

  缺点:类加载时立即实例化对象,实例化的对象不被使用,造成内存的浪费。


  懒汉模式

  实现代码:

public class SingleDemo1 {

    private static SingleDemo1 singleDemo1 = null;

    private SingleDemo1(){}

    public static SingleDemo1 getInstance(){
        if( singleDemo1 == null ){
            return singleDemo1 = new SingleDemo1();
        }
        return singleDemo1;
    }

    public static void main(String[] args) {
        // 获取 实例对象
        SingleDemo1 singleDemo1 = getInstance();
        System.out.println(singleDemo1);
    }
    
}

  优点:

    1、获取实例时才进行实例的初始化,节省系统资源

  缺点:

    1、非线程安全

    2、系统开销大(每一次获取都需要进行非空检查)


 

让 懒汉模式 变得 线程安全 (  双重检查锁 )

  实现代码:

public class SingleDemo2 {

    private static volatile SingleDemo2 singleDemo2 = null;

    private SingleDemo2(){}

    public static SingleDemo2 getInstance(){
        if( singleDemo2 == null ){
            synchronized (SingleDemo2.class){
                if( singleDemo2 == null ){
                    return new SingleDemo2();
                }
            }
        }
        return singleDemo2;
    }

}

 

 

 


 

  内部类实现方式

public class SingleDemo3 {

    private SingleDemo3(){}
    
    private static class getSingleDemo3Class{
        private static SingleDemo3 singleDemo3 = new SingleDemo3();
    }

    public static SingleDemo3 getInstance(){
        return getSingleDemo3Class.singleDemo3;
    }

}

 

 

  优点:

    1、内部类只有在外部类被调用才加载,从而实现延迟加载

    2、线程安全,且不用加锁

 

posted @ 2020-05-22 21:20  追梦滴小蜗牛  阅读(593)  评论(0编辑  收藏  举报