单例设计模式
Posted guxiaohai_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例设计模式相关的知识,希望对你有一定的参考价值。
一:简介
- 单例模式是最常用到的设计模式之一,分为饿汉式 和 懒汉式 这两种实现方式。
一个类在整个系统中只有一个实例,而且这个实例在类的内部由private构造的,外部不能直接调用其构造方法,只能获取它的实例. - 单例模式的优点:
在内存中只有一个实例对象,节省内存空间.避免重复的创建和销毁对象,可以提高性能,避免对多重资源的重复占用,可以全局进行访问.
二:饿汉式单例
-
方式1:
public class EHanSingleCase { private static EHanSingleCase eHanSingleCase = new EHanSingleCase(); private EHanSingleCase(){}; public static EHanSingleCase getInstance(){ return eHanSingleCase; } }
优点:实现简单,不存在多线程问题,直接声明一个私有对象,然后对外提供一个获取对象的方法。
缺点:class 类在被加载的时候创建EHanSingleCase实例,如果对象创建后一直没有使用,则会浪费很大的内存空间,此方法不适合创建大对象。
三:懒汉式单例
-
方式一(线程不安全):
public class LHanSingleCase { private static LHanSingleCase lHanSingleCase = null; private LHanSingleCase(){}; public static LHanSingleCase getInstance(){ if(lHanSingleCase == null){ lHanSingleCase = new LHanSingleCase(); } return lHanSingleCase; } }
优点:节省内存空间,在使用的时候才会创建;
缺点:在多线程下,可能会创建多个实例(一定要重视这个问题,有时候如果在单例对象的构造方法中做了某些重要操作,创建多个实例可能会造成可怕后果,如:打开android的Sqlite数据库连接)。
-
方式二(线程安全):
public class LHanSingleCase { private static LHanSingleCase lHanSingleCase = null; private LHanSingleCase(){}; public static synchronized LHanSingleCase getInstance(){ if(lHanSingleCase == null){ lHanSingleCase = new LHanSingleCase(); } return lHanSingleCase; } }
优点:支持多线程,且以懒汉式的方式加载,不浪费内存空间。
缺点:将 synchronized 块加在方法上,会影响并发量,每次调用getInstance()方法都会线程同步,效率十分低下。最重要的是,当创建好实例对象之后,就不必继续进行同步了。
-
方式三(线程安全,推荐):
public class LHanSingleCase { private static LHanSingleCase lHanSingleCase = null; private LHanSingleCase(){}; public static LHanSingleCase getInstance(){ if(lHanSingleCase == null){ synchronized (LHanSingleCase.class){ if(lHanSingleCase == null){ lHanSingleCase = new LHanSingleCase(); } } } return lHanSingleCase; } }
优点:支持多线程,并发量高,且以懒汉式加载,不浪费内存空间。
以上是关于单例设计模式的主要内容,如果未能解决你的问题,请参考以下文章