精华内容
下载资源
问答
  • 单例模式是码农常用的设计模式,但未必用的是最优的单例模式。 在此通过代码逐步分析出最优的单例模式,分享给各位码农。   一说到单例模式,我想最快想到的就是饿汉的单例模式,即: public class Singleton {...

    单例模式是码农常用的设计模式,但未必用的是最优的单例模式。

    在此通过代码逐步分析出最优的单例模式,分享给各位码农。

     

    一说到单例模式,我想最快想到的就是饿汉的单例模式,即:

    public class Singleton {
        private Singleton () {
        }
    
        private static Singleton instance = new Singleton();
    
        public static Singleton getInstance() {
            return instance;
        }
    }

    这种单例模式,有一个不足,无法做到延迟加载,特别是当这个单例类不只是做一件事的时候同时这个单例的创建过程很慢的时候,它的不足体现得就更为突出。

     

     

    另一种单例模式也比较容易想到,那就是懒汉单例模式,即:

    public class LazySingleton {
        private LazySingleton() {
        }
    
        private static LazySingleton instance = null;
    
        public static synchronized LazySingleton getInstance() {
            if (instance == null) {
                instance = new LazySingleton();
            }
            return instance;
        }
    }

     这种单例模式,也有一个很明显的不足,那就是引入同步关键字,在多线程的情况下,效率会低。

     

     

    那该如何设计单例模式呢,其实我们可以通过内部类的形式来写单例模式,即:

    public class StaticSingleton {
        private StaticSingleton() {
        }
    
        private static class SingletonHolder {
            private static StaticSingleton instance = new StaticSingleton();
        }
    
        public static StaticSingleton getInstance() {
            return SingletonHolder.instance;
        }
    }

     这种单例模式,即可以实现延迟加载,同时又不会引入同步关键字,完美了。。。

    展开全文
  • 最优的单例模式

    2008-11-05 09:51:17
    * 提供单例对象静态内部类 */ private static class SingletonHolder { public static QuestionManager instance = new QuestionManager(); } /** * 获取对象实例 * @return...

     

     

    public class QuestionManager {
    
    	/**
    	 * 提供单例对象的静态内部类
    	 */
    	private static class SingletonHolder {
    		public static QuestionManager instance = new QuestionManager();
    	}
    
    	/**
    	 * 获取对象实例
    	 * @return
    	 */
    	public static QuestionManager getInstance() {
    		return SingletonHolder.instance;
    	}
    
            private QuestionManager() {
    		//do init
    	}
    }
    
    

     备忘一下~

     

     

    展开全文
  • 个人认为下面是Java实现的最优的单例模式 这种实现方法采用内部静态类, 只在第一次调用getInstance方法的时候才实例化单例对象 如果不调用,就不会进行单例对象的实例化, 因此,既实现了延迟实例化,又不需要线程...
    个人认为下面是Java实现的最优的单例模式
    这种实现方法采用内部静态类,
    只在第一次调用getInstance方法的时候才实例化单例对象
    如果不调用,就不会进行单例对象的实例化,
    因此,既实现了延迟实例化,又不需要线程同步
    [quote]
    public class SingleTon {

    private SingleTon(){}

    public static SingleTon getInstance() {
    return SingleTonHolder.instance;
    }

    private static class SingleTonHolder{
    private static SingleTon instance=new SingleTon();
    }
    }
    [/quote]


    下面这种单例模式是应用最多的,同样不存在线程同步的问题
    但是,不能实现延迟实例化
    [quote]
    public class SingleTon {

    private SingleTon(){}
    private static SingleTon s=new SingleTon();

    public static SingleTon getInstance() {
    return s;
    }

    }
    [/quote]


    这种单例模式,和上面的实现差不多,虽然能够延迟单例对象的实例化,但是都是在同一时间范围内完成的
    [quote]
    public class SingleTon {

    private SingleTon(){}
    private static SingleTon s;

    static {
    s=new SingleTon();
    }

    public static SingleTon getInstance() {
    return s;
    }
    }
    [/quote]

    下面这种就是


    还有两种解决方案,不在本帖讨论范围之内
    1.采用synchronized的关键字同步getInstance方法
    2.采用synchronized的关键字同步代码段,双重是否为空的判断
    展开全文
  • 个人认为下面是Java实现的最优的单例模式 这种实现方法采用内部静态类, 只在第一次调用getInstance方法的时候才实例化单例对象 如果不调用,就不会进行单例对象的实例化, 因此,既实现了延迟实例化,又不需要...
    个人认为下面是Java实现的最优的单例模式 
    这种实现方法采用内部静态类,
    只在第一次调用getInstance方法的时候才实例化单例对象
    如果不调用,就不会进行单例对象的实例化,
    因此,既实现了延迟实例化,又不需要线程同步

    public class SingleTon {
    private SingleTon(){}
    public static SingleTon getInstance() {
    return SingleTonHolder.instance;
    }
    private static class SingleTonHolder{
    private static SingleTon instance=new SingleTon();
    }
    }



    下面这种单例模式是应用最多的,同样不存在线程同步的问题
    但是,不能实现延迟实例化

    public class SingleTon {
    private SingleTon(){}
    private static SingleTon s=new SingleTon();
    public static SingleTon getInstance() {
    return s;
    }
    }



    这种单例模式,和上面的实现差不多,虽然能够延迟单例对象的实例化,但是都是在同一时间范围内完成的

    public class SingleTon {
    private SingleTon(){}
    private static SingleTon s;
    static {
    s=new SingleTon();
    }
    public static SingleTon getInstance() {
    return s;
    }
    }

    下面这种就是


    还有两种解决方案,不在本帖讨论范围之内
    1.采用synchronized的关键字同步getInstance方法
    2.采用synchronized的关键字同步代码段,双重是否为空的判断
    展开全文
  • 最优单例模式

    千次阅读 2014-12-15 14:25:31
    直奔主题,单例模式是一种表面简单实则很精妙一个设计模式,网上有好多写法,什么饿汉懒汉什么多线程多处理器等等乱七八糟,个人觉得一种比较好写法如下。 public class SingleTon { private SingleTon() { ...
  • //定义一个静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用) private static volatile ...
  • 备忘:最优单例模式

    千次阅读 2008-11-05 11:41:00
    public class QuestionManager { /** * 提供单例对象静态内部类 */ private static class SingletonHolder { public static QuestionManager instance = new QuestionManage
  • 单例模式

    2017-06-08 18:04:16
    下面展示两种公认为最优的单例模式的写法 单例模式写法还是很多的,下面来介绍一下都优在哪 掌握这两种方法既可搞定单例模式.懒汉式 public class Singleton { // 私有化构造函数 private Singleton() {} // 返回...
  • 越多,发现所知越少。是时候丰富下基础知识了,以下...一、单例模式的概念:指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局访问点。(百度) 二、单例模式的
  • 废话不多说,直接上最优写法: 懒汉模式: class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) {
  • c++: 单例模式(Singleton)的最优写法

    千次阅读 2020-12-08 20:01:16
    本例简介C++中单例模式的最优写法。 实现 基础写法 下面代码是C++单例的基础写法,在静态函数Singleton::getInstance()中定义了Singleton静态变量对象,并返回此对象引用。 由于C++函数静态变量唯一性,可以...
  • 饥饿模式:很饿,立即实例化对象懒汉模式:很懒,用的时候才实例化对象考虑到性能和线程安全问题,我们一般选择下面两种比较经典的单例模式,在性能提高的同时,又保证了线程安全dubble check instance static ...
  • 为了达到线程安全,又能提高代码执行效率,我们这里可以采用DCL双检查锁机制来完成,代码实现如下: public class MySingleton { //使用volatile关键字保其可见性 volatile private static MySingleton ...
  • java 单例模式

    2017-10-30 21:47:21
    在java 程序开发过程中,经常为了线程安全而采用单例模式,那么现在主要有 饿汉式 单例模式,饱汉式单利模式,最优单例模式 ,其实这些知识人们约定俗成名称,具体意义只有体会代码了,好了,我直接上代码 ...
  • 直接贴代码,看到同学复制代码---看注释说明即可//最优单例问题public class Singleton {//1.标准饿汉模式--立即加载//private static Singleton singletonInstance = new Singleton();////public static ...
  • 1.懒汉模式 只适合单线程环境,在需要时候才去创建对象实例(时间换空间)。 优点:在不要对象实例时候,节省了内存空间。 缺点:在使用时候会先判断是否为空,为空话,才去创建对象。所以获取对象实例...
  • 枚举实现单例模式

    2020-10-31 14:01:08
    枚举实现单例模式引言饿汉单例懒汉单例枚举单例破解饿汉单例破解懒汉单例枚举实现单例的安全性引申 引言 饿汉单例、懒汉单例,最优的枚举单例 饿汉单例 饿汉单例实现: public class SingleTest { public static ...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 128
精华内容 51
关键字:

最优的单例模式