场景
保证一个类只有一个实例,并且解决了此类被频繁的创建及销毁。
解读
这是设计模式中最简单,也可能是最频繁使用的一种设计方法。在程序中,难以避免的会出现很多单例出现的场景。
实现关键
1:构造方法私有
2:提供一个静态方法,用于获取唯一实例
3:提供私有变量,保存当前实例
Singleton
1:懒汉方式
实现简单,懒加载,但线程不安全
public class Singleton {
private static Singleton instance;
//构造方法私有
private Singleton (){}
//提供一个供访问的静态方法。用于获取实例。
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
2:懒汉方式
实现简单,懒加载,线程安全。
备注:加锁会影响效率。
public class Singleton {
private static Singleton instance;
//构造方法私有
private Singleton (){}
//提供一个供访问的静态方法。用于获取实例。使用synchronized锁
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3:饿汉方式
实现简单,线程安全。 但容易产生垃圾对象。
public class Singleton {
private static Singleton instance = new Singleton();
//构造方法私有
private Singleton (){}
//提供一个供访问的静态方法。用于获取实例。
public static Singleton getInstance() {
return instance;
}
}
4:双锁
实现复杂,懒加载,在多线程中工作很出色。
public class Singleton {
//volatile锁变量
private volatile static Singleton singleton;
//构造私有
private Singleton (){}
//提供一个供访问的静态方法。用于获取实例。
public static Singleton getSingleton() {
if (singleton == null) {
//当 singleton 为null 的时候,才锁住。
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}