*## 单例模式
* 定义:确保某一个类只有一个实例,而且自行实例化并向系统提供这个实例。
* 常用四种实现方式:饿汉式,懒汉式,静态内部类,枚举。
1.饿汉式
public class Singleton{
private static fianl Singleton instance = new Singleton();
//私有化构造器,避免外部访问。使用反射仍然可以访问,所以安全是相对的。
//但仍然可以通过哈希值等进行限制,提高安全性。
priavte Singleton(){
}
//对外暴露的接口,用于获取实例
public static Singleton getInstance(){
return instance;
}
}
优点:能够在线程安全的情况下实现单例。
缺点:由于类一加载就会创建实例,所以会较早占用系统资源。反序列化会重新创建对象。
2.懒汉式
public class Singleton{
private static Singleton instance;
priavte Singleton(){
}
//加synchronized上锁,可以一定程度上确保安全性
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
优点:能够实现延迟加载,节约内存。在单线程中能很好工作。
缺点:并发下可能会创建多个实例,每次判断都会耗费一些时间。反序列化会重新创建对象。
3.静态内部类 (最好的单例模式实现)
public class Singleton{
priavte Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
//静态内部类确保了在首次调用getInstance()的时候才会初始化SingletonHolder,从而导致实例被创建。
//并且由JVM保证了线程的安全。
priavte static class SingletonHolder{
priavte static final Singleton instance = new Singleton();
}
//防止反序列化
private Object readResolve() throws ObjectStreamException{
return SingletonHolder.instance;
}
}
4.枚举
public enum Singleton{
INSTANCE;
public void doSomething(){
System.out.println("doSomething");
}
}