// 1. 在类初始化时加载,因此加载速度较慢,但调用效率高,且线程安全(四星推荐)
public class Singleton1 {
private static Singleton1 instance = new Singleton1();
Singleton1() {}
public static Singleton1 getInstance() {
return instance;
}
}
// 2. 适用于单线程场景,线程不安全,第一次调用效率较慢,加载速度较1有提升(不推荐)
public class Singleton2 {
private static Singleton2 instance = null;
Singleton2() {}
public static Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
// 3. 2的加强版,适用于多线程,但效率低下,每次获取实例都要加锁,非常耗时(不推荐)
public class Singleton3 {
private static Singleton3 instance = null;
private static Byte syncObj = new Byte();
Singleton3() {}
public static Singleton3 getInstance() {
synchronized(syncObj) {
if (instance == null) {
instance = new Singleton3();
}
}
return instance;
}
}
// 4. 3的改进版,通过双重判断来实现只需要在实例未创建时的第一次加锁;
// 这里用volatile修饰instance使得在创建实例后立刻能被其他线程看到(三星推荐)
public class Singleton4 {
private static volatile Singleton4 instance = null;
private static Byte syncObj = new Byte();
Singleton4() {}
public static Singleton4 getInstance() {
if (instance == null) {
synchronized(syncObj) {
if (instance == null) {
instance = new Singleton4();
}
}
}
return instance;
}
}
// 5. 通过静态内部类的方式私有化实例,线程安全,按需分配(五星推荐)
public class Singleton5 {
Singleton5() {}
private static class Nested {
private static final Singleton5 instance = new Singleton5();
}
public static Singleton5 getInstance() {
return Nested.instance;
}
}