单例与多例
1.单例设计模式
1.1不考虑多线程
public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } }
1.2线程安全
采用双重校验锁。
把singleton变量声明为volatile,指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取(否则可能一个线程读取的是主存中的,一个线程读取的寄存器中的)。一般说来,多任务环境下各任务间共享的标志都应该加volatile修饰。
注意:对静态方法的同步,同步的是class。
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) singleton = new Singleton(); } } return singleton; } }
2.多例模式
多例模式(Multiton Pattern)是单例模式的自然推广。作为对象的创建模式,多例模式或多例类有以下的特点:
1、多例类可以有多个实例
2、多例类必须能够自我创建并管理自己的实例,并向外界提供自己的实例。
多例模式的典型例子就是数据库线程池。