spring中的設計模式(四)
5.單例模式
首先單例模式中的懶漢和餓漢模式,
懶漢模式:
//懶漢式單例類.在第一次呼叫的時候例項化自己
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//靜態工廠方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
但是這個懶漢模式並沒有考慮到執行緒安全,所以可以有三種方法對這個懶漢模式進行執行緒安全化
1.給getInstance方法加synchronized關鍵字
2.雙重檢查鎖定
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
3.靜態內部類的方式
public class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
餓漢模式:
//餓漢式單例類.在類初始化時,已經自行例項化
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//靜態工廠方法
public static Singleton1 getInstance() {
return single;
}
}
區別:
餓漢模式天生就是執行緒安全的,而懶漢模式則需要自行實現執行緒安全
餓漢式模式在類建立的時候就會例項化一個靜態的物件出來,會佔用一定記憶體,但是相應的第一次呼叫會快一點
懶漢模式的延遲載入,需要呼叫的時候才會例項化物件
第一種方法實現同步的話,每次呼叫都會同步,非常耗效能,因為大部分情況是不需要同步的
第二種方法雙重判斷則避免了每次都需要同步的情況
第三種方法,利用了ClassLoader的機制確保初始化Intance的時候都只有一個執行緒
spring中的單例模式:
spring中的依賴注入都發生在AbstractBeanFactory的getBean方法裡面,而getBean方法裡面doGetBean方法中的getSingleton方法
protected Object getSingleton(String beanName, boolean allowEarlyReference)
{
Object singletonObject = singletonObjects.get(beanName);
if(singletonObject == null &&isSingletonCurrentlyInCreation(beanName))
synchronized(singletonObjects)
{
singletonObject = earlySingletonObjects.get(beanName);
if(singletonObject == null && allowEarlyReference)
{
ObjectFactory singletonFactory =(ObjectFactory)singletonFactories.get(beanName);
if(singletonFactory != null)
{
singletonObject = singletonFactory.getObject();
earlySingletonObjects.put(beanName, singletonObject);
singletonFactories.remove(beanName);
}
}
}
return singletonObject == NULL_OBJECT ? null : singletonObject;
}
可以看到spring中用的是懶漢模式的雙重判斷來實現執行緒安全的,避免在加鎖的瞬間有其他注入的時候建立例項
相關推薦
spring中的設計模式(四)
5.單例模式 首先單例模式中的懶漢和餓漢模式, 懶漢模式: //懶漢式單例類.在第一次呼叫的時候例項化自己 public class Singleton { private Singleton() {} private static Singleton sin
java面向對象與設計模式(四)
工廠方法模式 java 選擇 缺點 一個 聯系 面向 抽象工廠 pan 第五式 抽象工廠模式 定義:提供一個創建一系列相關或相互依賴對象的接口,而無需指定他們具體的類。(創建的對象之間有約束) 抽象工廠模式的本質:選擇產品簇的實現 優點:分離接口和產品簇,使得切換產品簇變得
設計模式(四)簡單工廠模式
spa 電腦 tco null 繼承 string 我們 實例 tro 相關文章 設計模式(一)設計六大原則 設計模式(二)單例模式的七種寫法 設計模式(三)建造者模式 1.簡單工廠模式簡單介紹 定義 簡單工廠模式屬於創建型模式又叫做靜
設計模式(四)---單例模式
由於 div 懶漢式 其它 ins class single sin pub 1、簡介 作為對象的創建模式,單例模式確保某一個類只有一個實例,並且自行實例化並向整個系統提供這個實例,這個類稱為單例類 2、單例模式有以下三個特點 2.1、單例類只能有一個實例
js設計模式(四)---叠代器模式
內部表 spa 需要 興趣 編程 log function cnblogs style 定義: 叠代器模式是指提供一種方法,順序訪問一個聚合對象中的各個元素,而又不需要暴露該對象的內部表示,叠代器模式可以把叠代的過程從業務邏輯中分離出來,使用叠代器模式,即使不關心對象的
Java設計模式(四)之建立型模式:建造者模式
一、定義: 建造者模式將一個複雜物件的構建與表示分離,使得同樣的構建過程可以建立不同的表示。 建造者模式的UML結構圖: 建造者模式主要包含四個角色: Builder:抽象建造者。它宣告為建立一
常用軟體設計模式(四)備忘錄模式
備忘錄模式:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態 優點:1、給使用者提供了一種可以恢復狀態的機制,可以使使用者能夠比較方便地回到某個歷史的狀態。 &nb
Java基礎總結之設計模式(四)
介面卡模式: 我們在開發程式的是時候,我們會寫介面,會寫介面的實現類,但是當介面中的方法很多時,我們則會因為為了使用裡面的一個功能而"被迫"實現介面中的所有方法。這樣的效率是很低的。就算是介面中其他的方法全部空實現,那對於程式碼的冗餘等爺都是很大的。所以介面卡模式是思想是將一個介面轉換成客戶希望
設計模式(四):原型模式
原型模式 UML類圖: 說明: 在Java中不需要ProtoType介面,Java自帶克隆介面:Cloneable,只需ConcreteProtoType直接實現Cloneable介面,之後重寫 clone()方法即可。 優點: ①隱藏了新物件建立的細節,大大提高了效能,
設計模式(四)---- 代理模式
代理模式(Proxy Pattern) 核心作用:通過代理控制物件的訪問;可以詳細訪問某個類或物件的方法,在呼叫這個方法之前做前置處理,呼叫這個方法之後做後置處理;(AOP的微實現) 核心角色: (1)抽象角色:定義代理角色和真實角色的公共對外方法; (2)真實角色:實現抽象角
設計模式 (四)抽象工廠模式
在有道雲筆記上寫的,抽象工廠模式 http://note.youdao.com/noteshare?id=684ceb68fafe75e7f2b273d0460e8420&sub=0540A1F277B245A494CB02E223440771 抽象工廠模式:提供一個建立一系列相
設計模式(四)—— 工廠模式
一、含義 工廠模式包含兩個方式:一個是抽象工廠模式,一個是工廠方法模式。 抽象工廠模式:提供一個介面,用於建立相關或依賴物件的家族,而不需要明確指定具體類。 工廠方法模式:定義一個建立物件的介面,但由子類決定要例項化的類是哪一個。工廠方法讓類把例項化推遲到子類中。
設計模式(四) Factory Pattern工廠模式
核心: 例項化物件,實現建立者和呼叫者的分離 簡單工廠模式 工廠方法模式 抽象工廠模式 面對物件設計的基本原則: ocp(open closed principle) 開閉原則:一個軟體的實體應當對拓展開放,對修改關閉 dip(dependence inversion princ
Java 設計模式(四):單例模式
參考連結:單例模式-Singleton Pattern 對於一個軟體系統的某些類而言,我們無須建立多個例項。舉個大家都熟知的例子——Windows工作管理員,如圖所示: 通常情況下,無論我們啟動任務管理多少次,Windows系統始終只能彈出一個工作管理員視窗。為什麼要這樣設計呢?我
設計模式(四)觀察者模式
繼續設計模式的文章,今天給大家帶來觀察者模式。先來看看觀察者模式的定義:定義了物件之間的一對多的依賴,這樣一來,當一個物件改變時,它的所有的依賴者都會收到通知並自動更新。好了,對於定義的理解總是需要例項來解析的,如今的微信服務號相當火啊,下面就以微信服務號為背景,給大家介紹
設計模式(四)裝飾模式
老樣子,先來看一個需求: 現在要求寫一個可以給人搭配不同的服飾的系統,比如類似QQ、網路遊戲或論壇都有的Avatar系統。怎麼開發? 第一個版本可能是這樣的—— 第一版 結構圖: Person類: class Person{ private st
一個故事貫穿設計模式(四)工廠模式
不習慣csdn的markdown編輯器。 又重新整理下。還好寫的東西不多。 包結構: 類結構: 核心實現: package com.automannn.design_mode.factory.test; import com.aut
設計模式(四)——抽象工廠模式
前面說了兩種設計模式,簡單工廠模式和工廠模式。簡單工廠模式是定義一個工廠類,工廠類根據呼叫時傳入的引數選擇建立哪一個類的例項。工廠模式是為每個類建立一個工廠,而這些工廠都實現了同一個工廠,客戶端在呼叫的
設計模式(四):代理模式
前言 國內程式設計師好像普遍對百度都沒好感,而且百度近些年產生了不少負面的新聞,像16年的魏則西事件,近期的導演吳京黑白照事件,以及最近作家六六斥百度李彥巨集:“你是做搜尋引擎還是騙子首領”,還有一件就是與程式設計師有關的:搜尋Julia語言,在百度和Google得出首條搜尋結果的差異性而被吐槽。Google
Java中設計模式(八):建造者模式
介紹 今天我們將研究java中的Builder模式。Builder 設計模式是一種創造性的設計模式,如工廠模式和抽象工廠模式。 當Object包含許多屬性時,引入了Builder模式來解決Factory和Abstract Factory設計模式的一些問題。 當Object包含許多屬性時,Factory和Abs