最原始的单例:
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;
}
}
此种单例模式可以有效保证只初始化一次,且每次加载类的时候不会初始化,既解决了多线程问题,同事对内存没有不必要的消耗。