单例模式
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; } }
第七种,为枚举,
以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章