1、基础写法,lazy loading,多个线程下会出现多个实例线程不安全,不推荐使用。
class Singleton{
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
2、修改的基础写法,lazy loading,线程安全,但是加锁同步效率低,不推荐使用。
class Singleton{
private static Singleton singleton;
private Singleton(){}
public synchronized static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
3、饿汉式写法,利用ClassLoader保证线程安全,no lazy loading。
class Singleton{
private static final Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
4、静态内部类写法,lazy loading,利用ClassLoader保证线程安全。
class Singleton{
private static class SingletonInstance {
private static final Singleton singleton = new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return SingletonInstance.singleton;
}
}
5、枚举式写法,Java Effective推荐写法,线程安全,代码简洁。
enum Singleton{
INSTANCE;
}
6、双锁式,代码比较复杂。
class Singleton {
private static volatile Singleton singleton;
private Singleton() {
}
public static Singleton getInstance(){
if(singleton == null){
synchronized (Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}