個人的一點參考總結,如有雷同,純屬巧合!
1、hashmap的實作原理、hashtable的執行緒安全性是怎麼實現的?
HashMap其實也是一個線性的陣列實現的,所以可以理解為其儲存資料的容器就是一個線性數組。
首先HashMap裡面實作一個靜態內部類別Entry,其重要的屬性有key , value, next,從屬性key,value我們就能很明顯的看出來Entry就是HashMap鍵值對實現的一個基礎bean,我們上面說到HashMap的基礎就是一個線性數組,這個數組就是Entry[],Map裡面的內容都保存在Entry[]裡面。
HashTable容器使用synchronized來確保線程安全,但在線程競爭激烈的情況下HashTable的效率非常低下。因為當一個執行緒存取HashTable的同步方法時,其他執行緒存取HashTable的同步方法時,可能會進入封鎖或輪詢狀態。
ConcurrentHashMap所使用的鎖分段技術,首先將資料分成一段一段的存儲,然後給每一段資料配一把鎖,當一個執行緒佔用鎖訪問其中一個段資料的時候,其他段的資料也能被其他線程存取。
2、hashmap的put(),get()實作原理?
第一個鍵值對A進來,透過計算其key的hash得到的index=0,記做:Entry[0] = A。一會後又進來一個鍵值對B,透過計算其index也等於0,現在怎麼辦? HashMap會這樣做:B.next = A,Entry[0] = B,如果又進來C,index也等於0,那麼C.next = B,Entry[0] = C;這樣我們發現index=0的地方其實訪問了A,B,C三個鍵值對,他們透過next這個屬性連結在一起。所以疑問不用擔心。也就是說數組中儲存的是最後插入的元素。
get()先定位,再遍歷。
3、spring bean的生命週期?
在spring中,singleton屬性預設為true,只有設定為false,則每次指定別名取得的Bean時都會產生一個新的實例。
3.1:Bean的建立:容器尋找Bean的定義資訊並將其實例化。
3.2:屬性注入。
3.3:BeanNameAware
3.4:BeanFactoryAware的setBeanFactory()
3.5:BeanPostProcessors的ProcessBeforeInitialization()
3.6:initializingBean的afterPropertiesSet():#od3.7:#od :
3.8:BeanPostProcessors的ProcessaAfterInitialization()
DisposableBean的destroy(),在Bean定義檔中定義destroy-method
#4、spring如何管理交易? Spring 的事務,可以說是 Spring AOP 的一種實作。反射和動態代理。
5、service層是單例還是多例的?是線程安全的嗎?如果要做到多實例怎麼做? spring產生物件預設是單例的。透過scope屬性可以更改為多例。
6、事物的傳播性?資料庫的隔離等級? PROPAGATION_REQUIRED 如果存在一個事務,則支援目前事務。如果沒有事務則開啟
PROPAGATION_SUPPORTS 如果存在一個事務,支援目前事務。如果沒有事務,則非事務的執行
PROPAGATION_MANDATORY 如果已經存在一個事務,支援目前事務。如果沒有一個活動的事務,則拋出異常。
PROPAGATION_REQUIRES_NEW 總是開啟一個新的交易。如果一個事務已經存在,則將這個存在的事務掛起。
PROPAGATION_NOT_SUPPORTED 總是非交易地執行,並掛起任何存在的交易。
PROPAGATION_NEVER 總是非事務地執行,如果存在一個活動事務,則拋出異常
PROPAGATION_NESTED 如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務,
則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行
在預設的情況下,我們採用的是
PROPAGATION_REQUIRED
① Serializable (串行化):可避免髒讀、無法重複讀取、幻讀的發生。
② Repeatable read (可重複讀取):可避免髒讀、不可重複讀取的發生。
③ Read committed (讀取已提交):可避免髒讀的發生。
④ Read uncommitted (讀取未提交):最低級別,任何情況都無法保證。
其中一般資料庫預設的為Read committed等級。
MySQL預設的隔離等級為 Repeatable read。
在MySQL資料庫中查看目前交易的隔離等級:
select @@tx_isolation;
在MySQL資料庫中設定交易的隔離等級:
## set [glogal | session] transaction isolation level 隔離等級名稱;
set tx_isolation='隔離等級名稱;'
記住:設定資料庫的隔離等級一定要是在開啟交易之前!
7、Arraylist如何實現執行緒安全性?
那麼為了解決這個線程安全問題你可以這麼使用Collections.synchronizedList(),如:
###List