记录几个Singleton实现方式。
Singleton模式是常用的模式,但实际使用中要注意线程安全的问题。
在只考虑使用同一个类加载器的情况下,可以利用类加载器的特性实现线程安全。
1.不使用Lazy Loading
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
类加载的机制确保了产生instance对象时是线程安全的,但是提前加载可能会浪费资源。
2.使用线程同步机制实现Lazy Loading
public class Singleton {
private static Object lockObj = new Object();
private static Singleton instance = null;
private Singleton(){
}
public static Singleton getInstance() {
// 只在instance为null的情况下检查锁,避免不必要的消耗
if (instance == null) {
synchronized (lockObj) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
使用了对象锁确保了线程安全,同时延迟了对象加载。
3.使用内部类实现Lazy Loading
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
使用了内部类加载机制确保了线程安全,同时延迟了对象加载。