spring5 核心原理 學習 單例模式

2021-10-23 02:32:54 字數 3158 閱讀 8444

public

class

hungrysingleton

public

static hungrysingleton getinstance()

}

另一種寫法

public

class

hungrysingleton

public

static hungrysingleton getinstance()

}

二、懶漢式單例模式是指被外部類呼叫的時候內部類才會載入。

/*

*/public

class

lazy******singleton

private

static lazy******singleton lazy******singleton=null;

public

static lazy******singleton getinstance()

return lazy******singleton;}}

public

class

exectorthread

implements

runnable

}public

class

lazy******signletontest

}

加入斷點,右鍵斷點,選中thread模式

不斷切換執行緒,觀察單例物件的記憶體狀態,發現單例物件被例項化兩次,後面的例項覆蓋了前面的例項,我們看到的是乙個假象,認為執行緒是安全的

*加入synchroized 關鍵字

*/public

class

lazy******singleton

private

static lazy******singleton lazy******singleton=null;

public

synchronized

static lazy******singleton getinstance()

return lazy******singleton;

}}通過除錯,當乙個執行緒呼叫getinstance()方法時,另乙個執行緒在呼叫getinstance()方法,執行緒的狀態變為monitor,出現阻塞,直到第乙個執行緒執行完

兼顧執行緒安全又能提公升程式效能的寫法

/***/

public

class

lazy******singleton

private

volatile

static lazy******singleton lazy******singleton=null;

public

static lazy******singleton getinstance()

}}return lazy******singleton;

}}

通過除錯,當乙個執行緒呼叫getinstance()方法時,另乙個執行緒在呼叫getinstance()方法,執行緒的狀態變為monitor,出現阻塞。此時,阻塞並不是基於整個lazy******singleton類,而實在getinstance()方法內部,只要邏輯不太複雜,對於呼叫者而言感知不到。(此處沒有測試效能差距,留個位置,測試後補充)

不使用synchronized關鍵字的寫法

/*

* 採用靜態內部類的寫法,這種方式兼顧了餓漢式單例模式的記憶體浪費問題和synchronized的效能問題,內部類一定是在方法掉用之前初始化,巧妙避免了執行緒安全問題。

*/public

class

lazyinnerclasssingleton

public

static

final lazyinnerclasssingleton getinstance()

private

static

class

lazyholder

}

/*

* 反射破壞單例 ,**是隨意寫的,主要為了測試用

*/public

class

lazyinnerclasssingletontest

catch

(instantiationexception e)

catch

(illegalacces***ception e)

catch

(invocationtargetexception e)

}catch

(nosuchmethodexception e)

}}

/*

* 序列化破壞單例

*/public

class

seriablesingleton

implements

serializable

public

static seriablesingleton getinstance()

// private object readresolve()}/*

* 將上述**注釋部分取消注釋即可

* 雖然增加readresolve()方法返回例項解決了單例模式被破壞問題,但實際上例項化了兩次,只是新建立的例項沒有被返回。

* 如果建立物件的動作發生頻率加快,就意味著記憶體分配開銷也會隨之增大

*/public

class

seriablesingletontest

catch

(exception e)

}}

Spring原理學習

簡介 spring 框架是乙個分層架構,由 7 個定義良好的模組組成。spring 模組構建在核心容器之上,核心容器定義了建立 配置和管理 bean 的方式。組成 spring 框架的每個模組 或元件 都可以單獨存在,或者與其他乙個或多個模組聯合實現。每個模組的功能如下 核心容器 核心容器提供 sp...

Spring5框架中IOC的概念 原理

三 ioc中beanfactory介面 一 什麼是ioc 什麼是ioc呢,上章節只是簡單的提出這個概念是控制反轉,其實簡單的講呢,有兩個點。控制反轉,把物件建立和物件之間的呼叫過程,交給spirng進行管理。使用ioc的目的,為了降低耦合度。二 ioc底層原理 ioc底層原理 ioc過程 通過xml...

spring5基礎學習之ioc 2

今天是iocxml配置的結尾,主要是引入外部的配置檔案 經典的jdbc 和xml實現自動裝配 首先xml實現自動裝配是使用乙個標籤實現例子 id emp class autowire.emp autowire byname id dept class autowire.dept name dname...