設計模式學習與應用——單例模式

單例模式

做用:一個類只有一個實例,而且提供訪問該實例的全局訪問點java

建立方式

1.懶漢方式spring

public class Singleton{
	//使外部沒法訪問這個變量,而要使用公共方法來獲取
	private static Singleton single = null;
	//只能單例類內部建立,因此使用私有構造器
	private Singleton(){}
	//公共方法返回類的實例,懶漢式,須要第一次使用生成實例
	//用synchronized關鍵字確保只會生成單例
	public static synchronized Singleton getInstance(){
		if(single == null){
			single = new Singleton();
		}
		return single;
	}
}

2.餓漢方式this

public class Singleton{
	//類裝載時構建實例保存在類中
	private static Singleton single = new Singleton();
	private Singleton(){}
	public static Singleton getInstance(){
		return single;
	}
}

Spring中的單例

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
       Object singletonObject = this.singletonObjects.get(beanName);
       if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {//1
           synchronized (this.singletonObjects) {//2
               singletonObject = this.earlySingletonObjects.get(beanName);
               if (singletonObject == null && allowEarlyReference) {
                   ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                   if (singletonFactory != null) {
                       singletonObject = singletonFactory.getObject();
                       this.earlySingletonObjects.put(beanName, singletonObject);
                       this.singletonFactories.remove(beanName);
                   }
               }
           }
       }
       return (singletonObject != NULL_OBJECT ? singletonObject : null);
   }

spring依賴注入時使用的是「雙重加鎖」的單例模式code

雙重加鎖:

1.若是單例已經存在,則返回這個實例
2.若是單例爲null,進入同步塊進行加鎖,生成單例對象

應用場景

1.須要生成惟一序列的環境
 2.須要頻繁實例化而後銷燬的對象。
 3.建立對象時耗時過多或者耗資源過多,但又常常用到的對象。
 4.方便資源相互通訊的環境資源

相關文章
相關標籤/搜索