最原始的單例:
class HotelBusProcessor{
private static HotelBusProcessor instance = null;
private HotelBusProcessor(){
}
public static HotelBusProcessor getInstance(){
if(instance==null) instance = new HotelBusProcessor();//這裏在多線程的時候可能會出現前一線程正在初始化,後一線程仍然判斷爲null的狀況
return instance;
}
}
正確寫法
寫法一:
class HotelBusProcessor{
private static HotelBusProcessor instance = new HotelBusProcessor();
private HotelBusProcessor(){
}
public static HotelBusProcessor getInstance(){
return instance;
}
}
此種單例模式可以有效保證只初始化一次,但是每次加載類的時候都會初始化,雖然解決了多線程問題,但對內存有不必要的消耗。
寫法二:
class HotelBusProcessor{
private HotelBusProcessor(){
}
private static class singleInstanceHolder{
private static HotelBusProcessor instance = new HotelBusProcessor();
}
public static HotelBusProcessor getInstance(){
return singleInstanceHolder.instance;
}
}
此種單例模式可以有效保證只初始化一次,且每次加載類的時候不會初始化,既解決了多線程問題,同事對內存沒有不必要的消耗。
寫法三:
class HotelBusProcessor{
private static HotelBusProcessor instance = null;
private HotelBusProcessor(){
}
public static HotelBusProcessor getInstance(){
if(instance==null){
synchronized(HotelBusProcessor.class){//整個類鎖住
//這裏在多線程的時候可能會出現前一線程正在初始化,後一線程仍然判斷爲null的狀況
if(instance==null) instance = new HotelBusProcessor();
}
}
return instance;
}
}
此種單例模式可以有效保證只初始化一次,且每次加載類的時候不會初始化,既解決了多線程問題,同事對內存沒有不必要的消耗。