單例模式學習筆記(詳細)

2021-10-08 19:58:05 字數 1589 閱讀 7746

四、總結

單例模式是一種常見的設計模式,定義是這個類只允許有乙個例項物件存在

spring的依賴注入,購買東西時的購物車,window系統的**站等等

public

class

lazy

public

static lazy getinstance()

return instance;

}}

懶漢式,實行延遲載入,不會初始化,在需要用到例項的時候才去建立,用到的時候先檢查例項存不存在,存在就返回,不存在建立乙個返回,可以再單執行緒下使用,多執行緒下是不安全的,乙個執行緒通過了判空判斷的同時,另乙個執行緒也通過了判空判斷,就會同時建立多個例項,想要執行緒安全可以加synchronized關鍵字,但是會影響效率,不推薦。

public

class

hungry

public

static hungry getinstance()

}

public

class

doublecheck

public

static doublecheck getinstance()

}}return instance;

}}

雙檢鎖,外面一層if判斷物件存在就不會執行加鎖**,提高了效率,synchronized加上裡面一層 if 保證了執行緒安全

為什麼加volatile關鍵字

原因是 instance = new doublecheck(); 這句**不是原子性的。

建立乙個物件分為三步:

分配 instance 物件記憶體空間 n

在記憶體 n 初始化物件

把 n 的位址賦值給物件 instance

這時在例項instance指向n的時候,instance是不為空的

但是,編譯時編譯器可能會將2,3順序重新排序,造成順序為1-3-2

分配 instance 物件記憶體空間 n

把 n 的位址賦值給物件 instance

在記憶體 n 初始化物件

執行緒a,在記憶體 n 初始化物件之前就將 n 的位址賦值給了instance

這時執行緒b呼叫了getinstance方法,發現instance不為null

這個時候instance沒有初始化物件,執行緒b會將這個未初始化的物件返回,執行緒b在使用instance物件時就會出現問題

使用volatile修飾instance可以防止指令重排序,就可以避免這種現象發生。

public

static

class

single

private

singleton()

public

static

final singleton getinstance()

}

靜態內部類,在第一次使用時才會初始化內部類singleton,建立例項,保證了只有乙個例項,並實現了延遲載入,加上靜態域是執行緒安全的,減少了synchronized的開銷。

這四種是比較常見的單例模式實現方式

單例模式(詳細)

b站學習做的筆記 單例模式就是採取一定的方法保證整個軟體 統裡面對於某個類只能存在乙個例項 並且該類只提供乙個取物件例項的方法 靜態方法 餓漢式 靜態常量 餓漢式 靜態 塊 懶漢式 執行緒不安全 懶漢式 執行緒安全 同步方法 雙重檢查 靜態內部類 列舉 餓漢式的兩種寫法 1靜態常量 步驟 1.構造器...

單例模式學習筆記

單例 優點1.減少記憶體開支 2.減少效能開銷 3.寫檔案時避免資源多重占用 4.優化共享資源訪問 缺點1.自行例項化的特點導致無法擴充套件,只能修改原始碼 2.對測試不利,只有全部完成單例 才能測試 3.與單一職責原則有衝突 適用1.生成唯一序列號的環境 2.整個專案需要乙個共享訪問點 3.建立物...

單例模式學習筆記

public class student 自己造乙個 靜態方法只能訪問靜態成員變數,加靜態 為了不讓外界直接訪問修改這個值,加private private static student s new student 提供公共的訪問方式 為了保證外界能夠直接使用該方法,加靜態 public stati...