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...