单例模式-Singleton Pattern
单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。 单例模式有三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。 饿汉式单例、带双重检查锁定机制的懒汉式单例、IoDH 饿汉式单例: 在定义静态变量的时候实例化单例类,因此在类加载的时候就已经创建了单例对象 ========================================================== class EagerSingleton { private static final EagerSingleton instance = new EagerSingleton(); private EagerSingleton() { } public static EagerSingleton getInstance() { return instance; } } ========================================================== 带双重检查锁定机制的懒汉式单例: 如果使用双重检查锁定来实现懒汉式单例类,需要在静态成员变量instance之前增加修饰符volatile, 被volatile修饰的成员变量可以确保多个线程都能够正确处理,且该代码只能在JDK 1.5及以上版本中才能正确执行。 由于volatile关键字会屏蔽Java虚拟机所做的一些代码优化,可能会导致系统运行效率降低, 因此即使使用双重检查锁定来实现单例模式也不是一种完美的实现方式。 ========================================================== class LazySingleton { private volatile static LazySingleton instance = null; private LazySingleton() { } public static LazySingleton getInstance() { //第一重判断 if (instance == null) { //锁定代码块 synchronized (LazySingleton.class) { //第二重判断 if (instance == null) { instance = new LazySingleton(); //创建单例实例 } } } return instance; } } =========================================================== IoDH:在IoDH中,我们在单例类中增加一个静态(static)内部类,在该内部类中创建单例对象, 再将该单例对象通过getInstance()方法返回给外部使用
//Initialization on Demand Holder
public class Singleton {
private Singleton() {
}
//静态内部类
private static class HolderClass {
private final static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return HolderClass.instance;
}
public static void main(String args[]) {
Singleton s1, s2;
s1 = Singleton.getInstance();
s2 = Singleton.getInstance();
System.out.println(s1==s2);
}
}