1. 程式人生 > >spring中的設計模式(四)

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