以下内容摘抄于《C#大话设计模式》
单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问他的全局访问点。
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
单例模式的结构图如下:
代码如下:
package com.schema.singleton;
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton GetInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
客户端代码
package com.schema.singleton;
public class AppMain {
public static void main(String[] args) {
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
if(s1 == s2){
System.out.println("Equal.");
}
}
}
以上只是单线程时的单例模式,下面是
多线程的单例模式
package com.schema.singleton;
public class Singleton {
private static Singleton instance;
private static Object o = new Object();
private Singleton(){}
public static Singleton GetInstance(){
synchronized(o){
if(instance == null){
instance = new Singleton();
}
}
return instance;
}
}<strong>
</strong>
由于在每次调用GetInstance时需要加锁,因此做以下改进:
package com.schema.singleton;
public class Singleton {
private static Singleton instance;
private static Object o = new Object();
private Singleton(){}
public static Singleton GetInstance(){
if(instance == null){
synchronized(o){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
此时我们不用让线程每次都加锁,而只是在实例未被创建的时候再加锁处理。同时也能保证多线程的安全,这种做法被称为 Double-Check Locking(双重锁定)。