一个类只存在一个实例化对象。分为懒汉式和饿汉式,懒汉式,懒加载只有需要的时候才会创建实例。饿汉式,当类被第一次调用时,就会创建实例。
当占用资源少,不需要延时加载时,可采用枚举创建单例,好于饿汉式。
当占用资源大,需要延时加载时,可采用静态内部类创建,好于懒汉式。
由于双重检测锁存在问题,不在进行总结。
/**
* 饿汉式--没有延时加载,不使用也会加载,浪费资源
*/
class SingletonDemo1 {
private static SingletonDemo1 instance = new SingletonDemo1();
private SingletonDemo1() {
}
public static SingletonDemo1 getInstance() {
return instance;
}
}
/**
* 懒汉式--延时加载,需要时才创建
*/
class SingletonDemo2 /*implements Serializable */{
private static SingletonDemo2 instance = null;
private SingletonDemo2() {
//防止通过反射实例化
/*if (instance != null) {
throw new RuntimeException();
}*/
}
public synchronized static SingletonDemo2 getInstance() {
if (instance == null) {
instance = new SingletonDemo2();
}
return instance;
}
//防止反序列化破解单例
/*private Object readResolve() throws ObjectStreamException {
return instance;
}*/
}
/**
* 静态内部类实现--线程安全,调用效率高,延时加载
*/
class SingletonDemo4 {
private static class SingletonClassInstance {
private static final SingletonDemo4 instance = new SingletonDemo4();
}
private SingletonDemo4() {
}
public static SingletonDemo4 getInstance() {
return SingletonClassInstance.instance;
}
}
/**
* 通过枚举方式实现--没有延时加载
*/
enum SingletonDemo5 {
INSTANCE;
public void singletonOperation() {
}
}