起码有两次面试让我写单例类,但是有时候确认写的不尽人意,今天记录一下。
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
饿汉式单例
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
懒汉式单例
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
内部类
public class Singleton {
private Singleton() {}
public static Singleton getInstance() {
return SingletonHold.INSTANCE;
}
private static class SingletonHold {
private static final Singleton INSTANCE = new Singleton();
}
}
当调用getInstance()方法时,SingletonHold类才会加载,所以实现了延迟加载;由于JVM对静态属性,静态代码块,隐含的实现了同步控制,保证了线程安全。
还有一种是用枚举实现,现在先不写了