[JAVA笔记]-基础-单例模式中懒汉式和饿汉式区别

单例模式中懒汉式和饿汉式区别

懒汉式和饿汉式区别

  • 懒汉模式: 在类加载的时候不被初始化
  • 饿汉模式: 在类加载时就完成了初始化 但是加载比较慢 获取对象比较快。
  • 饿汉模式是线程安全的: 在类创建好一个静态对象提供给系统使用
  • 懒汉模式在创建对象时不加上 synchronized,会导致对象的访问不是线程安全的。
  • 饿汉式
public class Singleton {
    //饿汉式
    private static Singleton singleton = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return singleton;
    }

    @Override
    public String toString(){
        return "饿汉式";
    }
}
  • 懒汉式
public class Singleton2 {
    //懒汉式
    private  static Singleton2 singleton = null;
     private Singleton2(){

     }

     public static synchronized Singleton2 getInstance(){
         if (singleton==null){
             singleton = new Singleton2();
         }
         return singleton;
     }

     @Override
    public String toString(){
         return "我是懒汉式";
     }
}

注意! 上面的懒汉式从代码可以发现, 如果多线程访问, 有可能出现问题: 如果一个线程进入条件判断if(singleton == null){}且还未创建对象的时候又进来一个线程执行, 再次判断为空, 那么这两个线程就会创建两个对象, 那就不是我们要的单例模式了

  • 双重锁懒汉式(懒汉式优化)
public class Singleton3 {
    //懒汉式
    private  static Singleton3 singleton = null;
    private Singleton3(){

    }

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

    @Override
    public String toString(){
        return "我是双重锁懒汉式";
    }
}
  • 测试类
public class TestSingleton {
    public static void main(String[] args) {
        //饿汉式
        Singleton s = Singleton.getInstance();
        System.out.println(s);
        System.out.println("==========");

        //懒汉式
        Singleton2 s2 = Singleton2.getInstance();
        System.out.println(s2);
        System.out.println("==========");

        //懒汉式针对多线程优化,双重锁懒汉式
        Singleton3 s3 = Singleton3.getInstance();
        System.out.println(s3);
    }
}
  • 运行结果 image

从实现方式来讲他们最大的区别

  • 懒汉式是廷时加载 是在需要的时候才创建对象,
  • 而饿汉式在虚拟机启动的时候就会创建

应用场景·

懒汉式的特点是延迟加载 比如配置文件 采用懒汉式的方法

更新时间:2019-10-18 14:43:38

本文由 Alicyu 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://www.alicyu.com/archives/singleton
最后更新:2019-10-18 14:43:38

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×