Java--设计模式之单例模式
2016-12-26 23:33
204 查看
java单例模式
单例模式的特点
单例类只能有一个实例;单例类必须自己创建自己的唯一实例;
单例类必须给所有其他对象提供这一实例。
两种常用的单例类设计
懒汉式:public class Singleton{ private static Singleton instance = null; private Singleton(){} public static Singleton getInstance(){ if(instance == null) instance = new Singleton(); return instance; } }
饿汉式:
public class Singleton{ private static Singleton instance = new Singleton(); private Singleton(){} private static Singleton getInstance(){ return instance; } }
懒汉式顾名思义,在类加载的时候,并不对实例进行初始化,只有在用到对象的时候才初始化一个实例,这也叫做延迟加载(lazy loading)。饿汉式是在类加载的时候,就实例化,没有提供延迟加载的功能。懒汉式的延迟加载有利于节省内存,但多线程不安全;饿汉式避免了多线程的同步问题。下面看常用的三种线程安全的懒汉式单例模式
锁方法
public class Singleton{ private static Singleton instance = null; private Singleton(){} public static synchronized Singleton getInstance(){ if(instance == null) instance = new Singleton(); return instance; } }
双重锁
public class Singleton{ private volatile static Singleton instance = null; private Singleton(){} public static Singleton getInstance(){ if(instance == null){ synchronized(Singleton.class){ if(instance == null) instance = new Singleton(); } } return instance; } }
静态内部类
public class Singleton{ private static class SingletonHolder{ private static final Singleton INSTANCE = new Singleton(); } private Singleton(){} public static final Singleton getInstance(){ return SingletonHolder.INSTANCE; } }
第一种锁方法的实现线程安全的方式,直接将同步关键字加在方法上,这样每次调用改方法的时候都需要进行加锁,而不管有没有实例化,而加锁的很耗时,这样效率很低。PS:99%的情况下不需要同步。
第二种双重锁的方式,只有第一次进入的方法在创建实例的时候需要加锁,以后再调用该方法都不需要加锁,提高了效率。
第三种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它更像是一种提供了延迟加载的饿汉式方法。这种方式中Singleton类被装载,而instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。想象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,我不希望在Singleton类加载时就实例化,因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。
单例模式用在哪些地方?
管理器相关的类,这种情况下管理器不能出现多个封装配置文件的类,写成单例避免冲突
资源相关的类
相关文章推荐
- 用Java实现的设计模式系列(3)--Builder
- Java设计模式
- 在Java中应用设计模式 - Factory Method
- java设计模式之创建模式--singleton
- 深入浅出基于Java的解释器设计模式
- 用Java实现的设计模式系列(1)-Factory
- 深入浅出基于Java的代理设计模式
- Java设计模式专辑
- Java设计模式使用率爬行榜
- Java的建造设计模式
- 追MM与设计模式(java的32种设计模式)
- Java设计模式之Factory
- Java设计模式之Factory
- Java设计模式使用率爬行榜
- [收藏]追MM与JAVA设计模式
- Java设计模式之工厂模式篇
- 追MM与Java的23种设计模式
- 从Java类库看设计模式
- 追MM与Java的23种设计模式
- 在Java中应用设计模式 - Factory Method