【设计模式】单例模式
确保一个类只有一个实例,并提供一个全局访问点。
那么怎样保证一个类只有一个实例呢? 就要保证这个类不能被实例化,否则随便在类的外面new对象就不能保证唯一性了。因此单例模式第一件要做的事情就是 私有化构造方法
public class Singleton {
private Singleton() {
}
}
构造方法私有化之后,就要提供一个只能存在一个的实例,返回这个单例对象
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
这样乍一看好像已经达到了一个单例的效果。但是还是需要考虑一点:并发,如果多个客户并发来访问这段代码,在 判断 if (singleton == null) 时,如果两个客户并发进来则会导致这两个客户得到的不同的实例,就没有达到单例的效果,因此单例代码还是需要修改。
下面分为三个修改模式:
- 直接用同步锁锁上(效率有点弱,只有在第一次singleton的null的时候这个同步锁才有用,以后的都是无意义的锁)
- 饿汉模式
- 懒汉模式
//直接加锁,效率下降很多
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
//饿汉模式
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {
}
public Singleton getInstance() {
return singleton;
}
}
//懒汉模式
public class Singleton {
private volatile static Singleton singleton;
private Singleton() {
}
public Singleton getInstance() {
if(singleton == null){
synchronized (Singleton.class) {
if(singleton == null)
singleton = new Singleton();
}
}
return singleton;
}
}
这个饿汉模式和懒汉模式的区别,从字面意义上也很好理解,一个是很急切的在类一加载的时候直接就初始化, 另一个懒汉模式,则是在需要用的时候再初始化。

浙公网安备 33010602011771号