1.定义
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2. 单例模式的本质:控制实例数目
Singleton:负责创建Singleton类自己的唯一实例,并提供一个getInstance的方法,让外部来访问这个类的唯一实例。
package com.fairy.dp.singleton;
public class Singleton {
/**
* 类级的内部类,也就是静态的成员式内部类,
* 该内部类的实例与外部类的实例没有绑定关系,
* 而且只有被调用到才会装载,从而实现了延迟加载
*/
private static class SingletonHolder {
/**
* 静态初始化器,由JVM来保证线程安全
*/
private static Singleton instance = new Singleton();
}
/**
* 私有化构造方法
*/
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
3 从Java 1.5发行版起,实现Singleton只需要编写一个包含单个元素的枚举类型:
package org.fool.ej;
/**
* Enforce the singleton property with a private constructor or an enum type
*/
public enum Singleton {
INSTANCE;
public static void main(String[] args) {
Singleton s1 = Singleton.INSTANCE;
Singleton s2 = Singleton.INSTANCE;
System.out.println(s1 == s2);
}
}
这种方法在功能上与公有域方法相近,但是它更加简洁,无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。虽然这种方法还没有广泛采用,但是单元素的枚举类型已经成为实现Singleton的最佳方法。
4. 懒汉式实现,时间换空间,不加同步的懒汉式是线程不安全的。
/**
* 懒汉式单例实现
*/
public class Singleton {
private static Singleton s = null;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if(s == null) {
s = new Singleton();
}
return s;
}
}
5. 饿汉式实现,空间换时间,饿汉式是线程安全的
/**
* 饿汉式单例实现
*/
public class Singleton {
private static Singleton s = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return s;
}
}