1.懒汉式写法
/**
* @author hx <br>
* @Title: <br>
* @Package <br>
* @Description: 懒汉式写法(线程不安全) <br>
* @date 2020/3/1615:37
*/
public class OneSingleton {
private static OneSingleton singleton = null;
private OneSingleton(){};
public static OneSingleton returnSingle(){
if (singleton == null){
singleton = new OneSingleton();
}
return singleton;
}
//这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。
}
2.懒汉,线程安全
/**
* @author hx <br>
* @Title: <br>
* @Package <br>
* @Description: 懒汉,线程安全<br>
* @date 2020/3/1615:42
*/
public class TwoSingleton {
private static TwoSingleton instance = null;
private TwoSingleton(){};
private static synchronized TwoSingleton getInstance(){
if (instance == null){
instance = new TwoSingleton();
}
return instance;
}
// 这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。
}
3.饿汉
public class Singleton3 {
private static Singleton3 instance = new Singleton3();
private Singleton3(){}
public static Singleton3 getInstance(){
return instance;
}
}
4.饿汉式变种
public class Singleton4 {
private static Singleton4 instatce = null;
static {
instatce = new Singleton4();
}
private Singleton4(){}
private static Singleton4 getInstance(){
return instatce;
}
}
5.饿汉式 静态内部类
public class Singleton5 {
private static class SingletonHold{
private static final Singleton5 instance = new Singleton5();
}
private Singleton5(){}
private static final Singleton5 getInstance(){
return SingletonHold.instance;
}
}
6.枚举
public enum Singleton6 {
INSTANCE;
public void whatever(){
}
}
7.双重判定
public class Singleton7 {
private volatile static Singleton7 singleton;
private Singleton7(){}
public static Singleton7 getInstance(){
if (singleton == null){
synchronized (Singleton7.class){
if (singleton == null){
singleton = new Singleton7();
}
}
}
return singleton;
}
}