单例模式是指在程序运行期间,该类有且只有一个实例对象。
通常有以下几种模式
饿汉模式
所谓的饿汉模式是指在加载类的时候,就创建对象实例。但是有一个缺点,如果没有使用该对象实例,就会造成内存浪费。实现方式就是定义一个静态的对象实例并直接初始化。
public class Singleton{
private final static Singleton singleton = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return singleton;
}
}
懒汉模式
所谓的懒汉模式是指采用延迟加载的策略,等到要使用该类的对象才会实例化,并返回该对象实例,但是存在线程不安全的问题。实现方式是在返回对象实例之时进行实例化。
public class Singleton{
private final static Singleton singleton;
private Singleton(){
}
public static Singleton getInstance(){
singleton = new Singleton();
return singleton;
}
}
懒汉模式之双重检测
为了解决懒汉模式下线程不安全的问题,最好的方式就是进行双重检测,避免多个线程同时访问到同一代码块。
public class Singleton{
private final static Singleton singleton;
private Singleton(){
}
public static Singleton getInstance(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}