单例模式
2016-03-24 00:00
274 查看
摘要: 设计模式 单例模式
单例模式
确保一个类只有一个实例,并提供一个全局访问点.
没有实现懒加载.
线程不安全,在多线程的情况下可能会出现多个实例.
通过增加synchronized关键字到getInstance()方法中,使每个线程在进入这个方法之前要先等候别的线程离开这个方法,也就是说不会有两个线程同步进入这个方法.但同步会降低性能并且只有第一执行此方法时才需要同步,设置好uniqueInstance这个变量后就不需要再同步这个方法.
这种方式利用classloder的机制来保证初始化instance时只有一个线程,饿汉只要Singleton类被装载了,instance就会被实例化,没有达到lazy loading效果,而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有通过调用getInstance方法,才会装载SingletonHolder类,从而实例化instance。
关于volatile可参考:Java 理论与实践: 正确使用 Volatile 变量
单例模式
确保一个类只有一个实例,并提供一个全局访问点.
1.饿汉
public class Singleton { private static Singleton uniqueInstance = new Singleton(); public static Singleton getInstance() { return uniqueInstance; } private Singleton() { } }
public class Singleton { private static Singleton uniqueInstance; static { uniqueInstance = new Singleton(); } public static Singleton getInstance() { return uniqueInstance; } private Singleton() { } }
没有实现懒加载.
2.懒汉
public class Singleton { private static Singleton uniqueInstance; public static Singleton getInstance() { if(uniqueInstance == null){ uniqueInstance = new Singleton(); } return uniqueInstance; } private Singleton() { } }
线程不安全,在多线程的情况下可能会出现多个实例.
public class Singleton { private static Singleton uniqueInstance; public static synchronized Singleton getInstance() { if(uniqueInstance == null){ uniqueInstance = new Singleton(); } return uniqueInstance; } private Singleton() { } }
通过增加synchronized关键字到getInstance()方法中,使每个线程在进入这个方法之前要先等候别的线程离开这个方法,也就是说不会有两个线程同步进入这个方法.但同步会降低性能并且只有第一执行此方法时才需要同步,设置好uniqueInstance这个变量后就不需要再同步这个方法.
3.静态内部类
public class Singleton { public static Singleton getInstance() { return SingletonHolder.INSTANCE; } private Singleton() { } private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } }
这种方式利用classloder的机制来保证初始化instance时只有一个线程,饿汉只要Singleton类被装载了,instance就会被实例化,没有达到lazy loading效果,而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有通过调用getInstance方法,才会装载SingletonHolder类,从而实例化instance。
4.双重检查加锁
public class Singleton { private volatile static Singleton uniqueInstance; public static Singleton getInstance() { if(uniqueInstance == null){ synchronized(Singleton.class) { if(uniqueInstance == null){ uniqueInstance = new Singleton(); } } } return uniqueInstance; } private Singleton() { } }
关于volatile可参考:Java 理论与实践: 正确使用 Volatile 变量
5.枚举
public enum Singleton { INSTANCE; public void doSomething(){ } }
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用