一、单列模式
我们可以让一个全局变量是得一个对象被访问,但它不能防止实例多个对象,一个最好的办法就是让类本身负责保存它的唯一实例,这个类可以保证没有其他实例可以创建。
单列模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点
class Singleton{
private static Singleton instance;
private Singleton() {
//构造方法让其private,堵死外界利用new创建此类实例的可能
}
public static Singleton GetInstance() {
if(instance==null) {
instance=new Singleton();
}
单列模式因为Singleton类封装它的唯一实例,这样它可以严格的控制客户怎样访问它,如何访问它。
客户端代码
public class dl {
public static void main(String[] args) {
// TODO Auto-generated method stub
Singleton s1=Singleton.GetInstance();
Singleton s2=Singleton.GetInstance();
if(s1==s2) {//比较两次实例化后对象,结果是相同的
System.out.println("相同实例");
}
}
}
二、多线程时的单列
多线程的单列,同时调用是可能创建多个实例的。
加一把锁,lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定代码,则它将一直等待,直到该对象被释放。
class Singleton{
private static Singleton instance;
private static readonly object syncRoot=new object();//程序运行时创建一个静态的只读的进程辅助对象。
private Singleton() {
}
public static Singleton GetInstance() {
lock(syncRoot){//在同一个时刻加了锁的那一部分程序只有一个线程进入
if(instance==null) {
instance=new Singleton();
}
}
}
return instance;
}
}
三、双重锁定
class Singleton{
private static Singleton instance;
private static readonly object syncRoot=new object();
private Singleton() {
}
public static Singleton GetInstance() {
if(instance== null) {
lock(syncRoot){
if(instance== null) {
instance=new Singleton();
}
}
}
//不让线程每次都加锁,只是在实例未创建的时候加锁处理,保证线程安全。
return instance;
}
}