简单介绍
单例模式为避免资源开销等而设计,具体做法是对构造器公开访问改为类内部访问,即private的访问属性,同时提供一个静态方法让外部请求得到该类的实例对象。
经典的单例模式实现(需要的时候在创建该实例)
public class Singleton {
private static Singleton instance;
private Singleton() {}
// 延迟实例化(lazy instantiaze)
public static Singleton getInstance() {
if (instance==null) {
instance = new Singleton();
}
return instance;
}
}
多线程下的单例模式
在多线程下可能产生对个单例,违背设计的初衷
1. 把getInstance() 变成同步(synchronized)方法
缺点:同步一个方法可能造成程序执行效率下降100倍。
该方应用场景:程序可以接受该效率的负担的时候。
public class Singleton {
private static Singleton instance;
private Singleton() {}
// 延迟实例化(lazy instantiaze)
/****
* 关键字synchronized使得每个线程进入该方法之前,要先等待其他线程离开该方法
* @return
*/
public static synchronized Singleton getInstance() {
if (instance==null) {
instance = new Singleton();
}
return instance;
}
}
2. 使用先创建实例的方式,而不是延迟方式
public class Singleton {
// 静态成员表示每个类共享一个实例,该操作是原子操作,多线程不影响
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}