单例模式

Posted nangongyibin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。


第一种 懒汉式,线程不安全,无法在多线程工作

/**

 * 懒汉式,lazy loading明显,线程不安全,无法多线程使用

 */

public class SinglePattern {

    private static SinglePattern singlePattern;

    public static SinglePattern getInstance() {

        if (singlePattern == null) {

            singlePattern = new SinglePattern();

        }

        return singlePattern;

    }

}

 

第二种 懒汉式,线程安全,但是锁的力度较大,易造成线程阻塞,导致效率低下

/**

 * 懒汉式,线程安全,多线程可使用,但锁的力度较大,

 * 易造成阻塞,效率低下

 */

public class SinglePattern {

    private static SinglePattern singlePattern;

    public static synchronized SinglePattern getInstance() {

        if (singlePattern == null) {

            singlePattern = new SinglePattern();

        }

        return singlePattern;

    }

}

 

第三种,饿汉式,利用ClassLoder机制避免了多线程的同步问题,但是没有Lazy loading的效果

/**

 * 饿汉式,基于ClassLoader机制避免了多线程同步问题

 * 但是未达到lazy loading的效果

 */

public class SinglePattern {

    private static SinglePattern mSinglePattern = new SinglePattern();

    private static SinglePattern getInstance() {

        return mSinglePattern;

    }

}

 

第四种,饿汉式,和第三种无较大差别,在类初始化的时候实例化对象

public class SinglePattern {

    private static SinglePattern singlePattern;

    static {

        singlePattern = new SinglePattern();

    }

    public static SinglePattern getInstance() {

        return singlePattern;

    }

}

 

第五种,饿汉式,静态内部类形式,可以达到Lazy loading

/**

 * 饿汉式,静态内部类

 * 这种方式同样利用Classloader机制,但是这种方式,可以避免在SinglePattern类加载的情况下,不被实例化

 * 只有通过主动调用getInstance()方法的时候才会调用SinglePatternHolder初始化实例

 * 可以达到Lazy loading

 */

public class SinglePattern {

    private static class SinglePatternHolder {

        private static SinglePattern singlePattern = new SinglePattern();

 

    }

    public static SinglePattern getInstance() {

        return SinglePatternHolder.singlePattern;

    }

}

 

第六种:双重校验锁 懒汉式,线程安全

/**

 * 懒汉式加强版,将Synchronized关键字放到getInstance方法里,同时mSinglePattern加了volatile关键字

 * 既避免了多线程问题,又不降低效率

 * 但是volatile关键字也有性能问题,不建议大量使用

 */

public class SinglePattern {

    private volatile static SinglePattern mSinglePattern;

    public static SinglePattern getInstance() {

        if (mSinglePattern == null) {

            synchronized (SinglePattern.class) {

                if (mSinglePattern == null) {

                    mSinglePattern = new SinglePattern();

                }

            }

        }

        return mSinglePattern;

    }

}

 

第七种,为枚举,

 

以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块