zoukankan      html  css  js  c++  java
  • 关于单例模式的实现方式

    常用的五种单例模式实现方式

    ——主要:

      1.饿汉式(线程安全,调用率高,但是,不能延迟加载。)

      2.懒汉式(线程安全,调用效率不高,可以延时加载。)

    ——其他:

      1.双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题,不建议使用)

      2.静态内部类式(线程安全,调用效率高。但是,可以延时加载)

      3.枚举式(线程安全,调用率高,不能延时加载)

    如何选用?

      ——单例对象 占用资源少,不需要 延时加载

        枚举式 好于 饿汉式

      ——单例对象 占用资源大,需要延时加载

        静态内部类式 好于 懒汉式

    下面介绍一下 java设计模式单例模式中懒汉式与饿汉式的区别





    饿汉式:
            public class Singleton{
                private static Singleton singleton = new Singleton ();
                private Singleton (){}
                public static Singleton getInstance(){return singletion;}
           } 

         懒汉式:
           public class Singleton{
                private static Singleton singleton = null;
                public static synchronized synchronized getInstance(){
                     if(singleton==null){
                         singleton = new Singleton();
                     }
                    return singleton;
                }
           } 

         比较:
             饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
              懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
              推荐使用第一种 

    从实现方式来讲他们最大的区别就是懒汉式是延时加载,
    他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,
     
    饿汉式无需关注多线程问题、写法简单明了、能用则用。但是它是加载类时创建实例,所以如果是一个工厂模式、缓存了很多实例、那么就得考虑效率问题,因为这个类一加载则把所有实例不管用不用一块创建。
    懒汉式的优点是延时加载、缺点是应该用同步(想改进的话现在还是不可能,比如double-check)、其实也可以不用同步、看你的需求了,多创建一两个无引用的废对象其实也没什么大不了。
  • 相关阅读:
    Mac php使用gd库出错 Call to undefined function imagettftext()
    centos 使用 locate
    Mac HomeBrew 安装 mysql
    zsh 命令提示符 PROMPT
    新的开始
    Java 面试题分析
    Java NIO Show All Files
    正确使用 Volatile 变量
    面试题整理 2017
    有10阶梯, 每次走1,2 or 3 阶,有多少种方式???
  • 原文地址:https://www.cnblogs.com/Mark-blog/p/8575552.html
Copyright © 2011-2022 走看看