漫谈设计模式(三)单例(Singleton)模式
程序员文章站
2024-01-05 21:00:58
...
如果要保证系统里一个类最多自能存在一个实例,我们就要使用单例模式
最简单的单例模式
进阶-延迟创建且线程安全
出于性能方面考虑,我们希望延迟实例化单例对象(Static属性在加载类时就会被初始化),只有在第一次使用该类的实例时才去实例化,我们应该怎么办呢?
doublecheck locking模式
lazyLoadedSingleton
当JVM加载lazyLoadedSingleton类时,由于该类没有static属性,所以加载完成后便即可返回,只有第一次调用getInstance()方法时,JVM才会加载LazyHolder,由于它包含static属性,所以会先初始化这个变量,根据前面过程介绍,我们知道此过程并不会出现并发问题(JLS保证),这样即实现了一个既保证现成安全又支持延迟加载的单例模式
Singleton的序列化
最简单的单例模式
package com.model.sigleton; public class Singleton { private static Singleton singleton = new Singleton(); /** * 唯一的构造方法被private修饰,表示外部无法通过构*法创建对象 */ private Singleton() { } public static Singleton getInstance() { return singleton; } }
进阶-延迟创建且线程安全
出于性能方面考虑,我们希望延迟实例化单例对象(Static属性在加载类时就会被初始化),只有在第一次使用该类的实例时才去实例化,我们应该怎么办呢?
package com.model.sigleton; /** * * @author leo Chen * */ public class UnThreadSafeSingelton { private static UnThreadSafeSingelton instatnce; // variables and constructors... /** * * @return */ public static synchronized UnThreadSafeSingelton getInstance() { if (instatnce == null) { instatnce = new UnThreadSafeSingelton(); } return instatnce; } }
doublecheck locking模式
package com.model.sigleton; public class DoubleCheckSingleton { private volatile static DoubleCheckSingleton instantnce = null; // constructors public static DoubleCheckSingleton getInstance() { if (instantnce == null) {// check if it is created. synchronized (DoubleCheckSingleton.class) { if (instantnce == null) { instantnce = new DoubleCheckSingleton(); } } } return instantnce; } }
lazyLoadedSingleton
package com.model.sigleton; public class LazyLoadedSingleton { private LazyLoadedSingleton() { } private static class LazyHolder { private static final LazyLoadedSingleton LAZY_LOADED_SINGLETON = new LazyLoadedSingleton(); } public static LazyLoadedSingleton getInstance() { return LazyHolder.LAZY_LOADED_SINGLETON; } }
当JVM加载lazyLoadedSingleton类时,由于该类没有static属性,所以加载完成后便即可返回,只有第一次调用getInstance()方法时,JVM才会加载LazyHolder,由于它包含static属性,所以会先初始化这个变量,根据前面过程介绍,我们知道此过程并不会出现并发问题(JLS保证),这样即实现了一个既保证现成安全又支持延迟加载的单例模式
Singleton的序列化
package com.model.sigleton; import java.io.Serializable; public class Singleton implements Serializable { /** * */ private static final long serialVersionUID = 1L; private static Singleton singleton = new Singleton(); /** * 唯一的构造方法被private修饰,表示外部无法通过构*法创建对象 */ private Singleton() { } public static Singleton getInstance() { return singleton; } private Object readResolve() { return singleton; } }