歡迎光臨
每天分享高質量文章

Java中高階面試題(5)

點選上方“芋道原始碼”,選擇“置頂公眾號”

技術文章第一時間送達!

原始碼精品專欄

 

什麼是執行緒死鎖?死鎖如何產生?如何避免執行緒死鎖?


死鎖的介紹:


執行緒死鎖是指由於兩個或者多個執行緒互相持有對方所需要的資源,導致這些執行緒處於等待狀態,無法前往執行。當執行緒進入物件的synchronized程式碼塊時,便佔有了資源,直到它退出該程式碼塊或者呼叫wait方法,才釋放資源,在此期間,其他執行緒將不能進入該程式碼塊。當執行緒互相持有對方所需要的資源時,會互相等待對方釋放資源,如果執行緒都不主動釋放所佔有的資源,將產生死鎖。

死鎖的產生的一些特定條件:

1、互斥條件:行程對於所分配到的資源具有排它性,即一個資源只能被一個行程佔用,直到被該行程釋放 。

2、請求和保持條件:一個行程因請求被佔用資源而發生阻塞時,對已獲得的資源保持不放。 

3、不剝奪條件:任何一個資源在沒被該行程釋放之前,任何其他行程都無法對他剝奪佔用。

4、迴圈等待條件:當發生死鎖時,所等待的行程必定會形成一個環路(類似於死迴圈),造成永久阻塞。

如何避免:


1、加鎖順序:

當多個執行緒需要相同的一些鎖,但是按照不同的順序加鎖,死鎖就很容易發生。如果能確保所有的執行緒都是按照相同的順序獲得鎖,那麼死鎖就不會發生。當然這種方式需要你事先知道所有可能會用到的鎖,然而總有些時候是無法預知的。

2、加鎖時限:

加上一個超時時間,若一個執行緒沒有在給定的時限內成功獲得所有需要的鎖,則會進行回退並釋放所有已經獲得的鎖,然後等待一段隨機的時間再重試。但是如果有非常多的執行緒同一時間去競爭同一批資源,就算有超時和回退機制,還是可能會導致這些執行緒重覆地嘗試但卻始終得不到鎖。

3、死鎖檢測:

死鎖檢測即每當一個執行緒獲得了鎖,會在執行緒和鎖相關的資料結構中(map、graph等等)將其記下。除此之外,每當有執行緒請求鎖,也需要記錄在這個資料結構中。死鎖檢測是一個更好的死鎖預防機制,它主要是針對那些不可能實現按序加鎖並且鎖超時也不可行的場景。


notify和notifyAll區別


他們的作用都是通知處於等待該物件的執行緒。


1、notifyAll使所有原來在該物件上等待被notify的執行緒統統退出wait的狀態,變成等待該物件上的鎖,一旦該物件被解鎖,他們就會去競爭。


2、notify是通知其中一個執行緒,不會通知所有的執行緒。


談一談對MySQL InnoDB的認識


介紹:


InnoDB引擎是MySQL資料庫的一個重要的儲存引擎,和其他儲存引擎相比,InnoDB引擎的優點是支援相容ACID的事務(類似於PostgreSQL),以及引數完整性(有外來鍵)等。現在Innobase實行雙認證授權.MySQL5.5.5以後預設的儲存引擎都是InnoDB引擎。

特點是:


1、具有較好的事務支援:支援4個事務隔離級別,支援多版本讀

2、行級鎖定:透過索引實現,全表掃描仍然會是表鎖,註意間隙鎖的影響

3、讀寫阻塞與事務隔離級別相關

4、具有非常高效的快取特性:能快取索引,也能快取資料

5、整個表和主鍵以Cluster方式儲存,組成一顆平衡樹

6、所有Secondary Index都會儲存主鍵資訊

適用場景:

1、需要事務支援(具有較好的事務特性)

2、行級鎖定對高併發有很好的適應能力,但需要確保查詢是透過索引完成

3、資料更新較為頻繁的場景

4、資料一致性要求較高

5、硬體裝置記憶體較大,可以利用InnoDB較好的快取能力來提高記憶體利用率,盡可能減少磁碟IO


談一談資料庫事務的隔離級別?

1、Read uncommitted(讀未提交)就是一個事務可以讀取另一個未提交事務的資料。

2、Read committed(讀提交)就是一個事務要等另一個事務提交後才能讀取資料。

3、Repeatable read(重覆讀)就是在開始讀取資料(事務開啟)時,不再允許修改操作。

4、Serializable(序列化)在該級別下,事務序列化順序執行,可以避免臟讀、不可重覆讀與幻讀。是最高的事務隔離級別,但是這種事務隔離級別效率低下,比較耗資料庫效能,一般不使用。

事務的作用就是保證資料的一致性、完整性。事務隔離級別越高,在併發下會產生的問題就越少,但同時付出的效能消耗也將越大,因此很多時候必須在併發性和效能之間做一個權衡。所以設立了幾種事務隔離級別,以便讓不同的專案可以根據自己專案的併發情況選擇合適的事務隔離級別,對於在事務隔離級別之外會產生的併發問題,在程式碼中做補償。

相關閱讀:

在一個千萬級的資料庫查尋中,如何提高查詢效率?

資料庫事務介紹


MySQL主備同步的基本原理


MySQL支援單向、非同步複製,複製過程中一個伺服器充當主伺服器,而一個或多個其它伺服器充當從伺服器。


MySQL複製是基於主伺服器在二進位制日誌中跟蹤所有對資料庫的更改。因此,要進行複製,必須在主伺服器上啟用二進位制日誌。每個從伺服器從主伺服器接收主伺服器已經記錄到日誌的資料。


當一個從伺服器連線主伺服器時,它通知主伺服器從伺服器在日誌中讀取的最後一次成功更新的位置。從伺服器接收從那時起發生的任何更新,併在本機上執行相同的更新。然後封鎖並等待主伺服器通知新的更新。從伺服器執行備份不會幹擾主伺服器,在備份過程中主伺服器可以繼續處理更新。


知識星球

目前在知識星球(https://t.zsxq.com/2VbiaEu)更新瞭如下 Dubbo 原始碼解析如下:

01. 除錯環境搭建
02. 專案結構一覽
03. API 配置(一)之應用
04. API 配置(二)之服務提供者
05. API 配置(三)之服務消費者
06. 屬性配置
07. XML 配置
08. 核心流程一覽

09. 拓展機制 SPI

10. 執行緒池


一共 60 篇++

贊(0)

分享創造快樂