java设计模式之单例模式
来源:互联网 发布:手机在linux查arp 编辑:程序博客网 时间:2024/06/16 06:03
单利模式是一种创建模式,只提供一个实例供外部使用:
私有化构造方法(private);
在其内部产生实例化对象;
定义一个静态方法返回该类的实例。
五种单例模式:
一、只适合单线程
public class Singleton { /** 持有私有静态实例,此处赋值为null,目的是实现延迟加载 */private static Singleton instance = null; /** 私有构造方法,防止被实例 */private Singleton(){} /** 静态工程方法,创建实例 */ public static Singleton getInstance(){ if(instance==null){ instance = new Singleton();} return instance; }}
缺点:只适合单线程,如果多个线程就会出现问题
二、多线程可以使用(懒汉模式)
public class Singleton { /** 持有私有静态实例,此处赋值为null,目的是实现延迟加载 */ private static Singleton instance = null; /** 私有构造方法,防止被实例 */ private Singleton(){} /** 静态工程方法,创建实例, */ public static synchronized Singleton getInstance(){ if(instance==null){ instance = new Singleton();} return instance; }}
缺点:synchronized关键字锁住的是这个对象,每次访问getInstance()时都会对对象上锁,这样性能有所下降,加锁比较耗时,能避免就避免
三、加同步锁并且让两次判断
public class Singleton {/** 持有私有静态实例,此处赋值为null,目的是实现延迟加载 */private static Singleton instance = null;/** 私有构造方法,防止被实例 */private Singleton(){}/** 静态工程方法,创建实例 */public static Singleton getInstance(){if(instance==null){synchronized (instance) {if(instance==null){instance = new Singleton();}}}return instance; }}
缺点:存在两次if判断,复杂,且容易出错,如果A、B两个线程同时进入了第一个if判断,此时instance为空,所以执行了instance = new Singleton(),当B进入时,此时instance已经不再为null,B要使用Singleton实例,却发现它没有被初始化,此时便会发生错误
四、饿汉式
public class Singleton {/** 持有私有静态实例 */private static Singleton instance = new Singleton();/** 私有构造方法,防止被实例 */private Singleton(){}/** 静态工程方法,创建实例 */public static Singleton getInstance(){return instance;}}
缺点:没有达到延迟加载(lazy loading),加载时就被初始化,浪费内存
五、内部类来维护单例
public class Singleton {/** 私有构造方法,防止被实例 */private Singleton(){}/** 使用内部类来维护单例 */private static class SingletonFactory{private static Singleton instance = new Singleton();}/** 获取实例 */public static Singleton getInstance(){return SingletonFactory.instance; }}
达到了延迟加载(lazy loading)效果。
一般情况下,不建议使用一、二两种方式,其它三种方式根据具体情况来使用。
0 0
- java设计模式之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- java设计模式之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java模式设计之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- D-BUS详细分析
- 8. String to Integer (atoi)
- eclipse中maven项目jar包下载失败解决办法
- [转]ubuntu 14.04 安装 Quartus II 13.1 过程
- Activity之使用技巧
- java设计模式之单例模式
- Lintcode22 Flatten List solution 题解
- LeetCode
- Struts2 spring整合 Action 出现java.lang.NoSuchMethodException异常
- VAO, VBO, PBO, FBO
- 2017.4.14 随机发牌
- 设计模式原则—迪米特原则
- Swift 3.0 学习笔记-3-集合类型
- 云掌通使用过程中的一个小问题