Java中高階面試題及答案解析(5)

2021-08-17 03:28:46 字數 2368 閱讀 8847

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

死鎖的介紹:

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

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

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

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

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

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

如何避免:

1、加鎖順序:

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

2、加鎖時限:

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

3、死鎖檢測:

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

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

Java中高階面試題(1)

list和set比較,各自的子模擬較 對比一 arraylist與linkedlist的比較 1 arraylist是實現了基於動態陣列的資料結構,因為位址連續,一旦資料儲存好了,查詢操作效率會比較高 在記憶體裡是連著放的 2 因為位址連續,arraylist要移動資料,所以插入和刪除操作效率比較低...

java中高階面試

同步互動 指傳送乙個請求,需要等待返回,然後才能夠傳送下乙個請求,有個等待過程 非同步互動 指傳送乙個請求,不需要等待返回,隨時可以再傳送下乙個請求,即不需要等待。區別 乙個需要等待,乙個不需要等待,在部分情況下,我們的專案開發中都會優先選擇不需要等待的非同步互動方式。哪些情況建議使用同步互動呢?比...

java高階面試題三

一 springmvc的工作原理 1 使用者傳送請求給 控制器 2 控制器指派處理器對映 3 根據handlemaooing查詢處理器 4 獲取到處理器位址 5 控制器返回處理器位址 6 控制器指派處理器介面卡 帶著處理器對映器返回的位址 7 處理器介面卡根據命令對c進行處理 8 c向m發出請求 9...