1.单线程模式下,推荐懒加载
public class Singleton1 {
private static Singleton1 singleton = null;
private Singleton1() {
}
public static Singleton1 getInstance() {
if (singleton == null) {
singleton = new Singleton1();
}
return singleton;
}
}
2.上述1演示,线程不安全,最容易想到的变为线程安全的方式就是加关键字synchronized
public class Singleton1_1 {
private static Singleton1_1 singleton = null;
private Singleton1_1() {
}
public synchronized static Singleton1_1 getInstance() {
if (singleton == null) {
singleton = new Singleton1_1();
}
return singleton;
}
}
3.“双重检查锁”(Double Check Lock,简称DCL)
public class Singleton1_2 {
private static Singleton1_2 singleton = null;
private Singleton1_2() {
}
public static Singleton1_2 getInstance() {
if (singleton == null) {
synchronized (Singleton1_2.class) {
if (singleton == null) {
singleton = new Singleton1_2();
}
}
}
return singleton;
}
}
4.由于指令重排,上述3,仍然可能不安全,volatile关键字可以解决此问题
public class Singleton1_3 {
private static volatile Singleton1_3 singleton = null;
private Singleton1_3() {
}
public static Singleton1_3 getInstance() {
if (singleton == null) {
synchronized (Singleton1_3.class) {
if (singleton == null) {
singleton = new Singleton1_3();
}
}
}
return singleton;
}
}
5.饿汉模式
public class Singleton2 {
private static final Singleton2 singleton = new Singleton2();
private Singleton2() {
}
public static Singleton2 getInstance() {
return singleton;
}
}