永遠年輕,永遠熱淚盈眶。
題目
寫一個單例模式
解析
單例模式有多種寫法,以下整理了六種寫法,你都學會了嗎?
public class Test01 {
/**
* 餓漢式
*/
public static class Singleton1{
private static final Singleton1 instance = new Singleton1();
private Singleton1(){}
public Singleton1 getInstance(){
return instance;
}
}
/**
* 懶漢式--非線程安全的
*/
public static class Singleton2{
private static Singleton2 instance = null;
private Singleton2(){}
public Singleton2 getInstance(){
if (instance == null){
instance = new Singleton2();
}
return instance;
}
}
/**
* 懶漢式--線程安全的(效率低,每次都要上鎖)
*/
public static class Singleton3{
private static Singleton3 instance = null;
private Singleton3(){}
public synchronized Singleton3 getInstance(){
if (instance == null){
instance = new Singleton3();
}
return instance;
}
}
/**
* 懶漢式--線程安全的(效率高,推薦使用)
*/
public static class Singleton4{
private static Singleton4 instance = null;
private Singleton4(){}
public static Singleton4 getInstance(){
if (instance == null){
synchronized (Singleton4.class){
if (instance == null){
instance = new Singleton4();
}
}
}
return instance;
}
}
/**
* 靜態內部類--線程安全(效率高,推薦)
*/
public static class Singleton5{
public static class SingletonHolder{
private static final Singleton5 instance = new Singleton5();
}
private Singleton5(){}
public static Singleton5 getInstance(){
return SingletonHolder.instance;
}
}
/**
* 枚舉方式
*/
public enum Singleton6{
INSTANCE;
public void method(){}
}
}