更新時間:2019-07-10 10:24:18 來源:動力節點 瀏覽2708次
馬上又是一個金九銀十的招聘旺季,小編在這里給大家整理了一套各大互聯網公司面試都喜歡問的一些中級Java面試題或者一些出場率很高的Java面試題,給在校招或者社招路上的你一臂之力。
什么是線程死鎖?死鎖如何產生?如何避免線程死鎖?
死鎖的介紹:
線程死鎖是指由于兩個或者多個線程互相持有對方所需要的資源,導致這些線程處于等待狀態,無法前往執行。當線程進入對象的synchronized代碼塊時,便占有了資源,直到它退出該代碼塊或者調用wait方法,才釋放資源,在此期間,其他線程將不能進入該代碼塊。當線程互相持有對方所需要的資源時,會互相等待對方釋放資源,如果線程都不主動釋放所占有的資源,將產生死鎖。
死鎖的產生的一些特定條件:
1、互斥條件:進程對于所分配到的資源具有排它性,即一個資源只能被一個進程占用,直到被該進程釋放。
2、請求和保持條件:一個進程因請求被占用資源而發生阻塞時,對已獲得的資源保持不放。
3、不剝奪條件:任何一個資源在沒被該進程釋放之前,任何其他進程都無法對他剝奪占用。
4、循環等待條件:當發生死鎖時,所等待的進程必定會形成一個環路(類似于死循環),造成永久阻塞。
如何避免:
1、加鎖順序:
當多個線程需要相同的一些鎖,但是按照不同的順序加鎖,死鎖就很容易發生。如果能確保所有的線程都是按照相同的順序獲得鎖,那么死鎖就不會發生。當然這種方式需要你事先知道所有可能會用到的鎖,然而總有些時候是無法預知的。
2、加鎖時限:
加上一個超時時間,若一個線程沒有在給定的時限內成功獲得所有需要的鎖,則會進行回退并釋放所有已經獲得的鎖,然后等待一段隨機的時間再重試。但是如果有非常多的線程同一時間去競爭同一批資源,就算有超時和回退機制,還是可能會導致這些線程重復地嘗試但卻始終得不到鎖。
3、死鎖檢測:
死鎖檢測即每當一個線程獲得了鎖,會在線程和鎖相關的數據結構中(map、graph等等)將其記下。除此之外,每當有線程請求鎖,也需要記錄在這個數據結構中。死鎖檢測是一個更好的死鎖預防機制,它主要是針對那些不可能實現按序加鎖并且鎖超時也不可行的場景。
notify和notifyAll區別
他們的作用都是通知處于等待該對象的線程。
1、notifyAll使所有原來在該對象上等待被notify的線程統統退出wait的狀態,變成等待該對象上的鎖,一旦該對象被解鎖,他們就會去競爭。
2、notify是通知其中一個線程,不會通知所有的線程。
談一談對MySQLInnoDB的認識
介紹:
InnoDB引擎是MySQL數據庫的一個重要的存儲引擎,和其他存儲引擎相比,InnoDB引擎的優點是支持兼容ACID的事務(類似于PostgreSQL),以及參數完整性(有外鍵)等。現在Innobase實行雙認證授權.MySQL5.5.5以后默認的存儲引擎都是InnoDB引擎。
特點是:
1、具有較好的事務支持:支持4個事務隔離級別,支持多版本讀
2、行級鎖定:通過索引實現,全表掃描仍然會是表鎖,注意間隙鎖的影響
3、讀寫阻塞與事務隔離級別相關
4、具有非常高效的緩存特性:能緩存索引,也能緩存數據
5、整個表和主鍵以Cluster方式存儲,組成一顆平衡樹
6、所有SecondaryIndex都會保存主鍵信息
適用場景:
1、需要事務支持(具有較好的事務特性)
2、行級鎖定對高并發有很好的適應能力,但需要確保查詢是通過索引完成
3、數據更新較為頻繁的場景
4、數據一致性要求較高
5、硬件設備內存較大,可以利用InnoDB較好的緩存能力來提高內存利用率,盡可能減少磁盤IO
談一談數據庫事務的隔離級別?
1、Readuncommitted(讀未提交)就是一個事務可以讀取另一個未提交事務的數據。
2、Readcommitted(讀提交)就是一個事務要等另一個事務提交后才能讀取數據。
3、Repeatableread(重復讀)就是在開始讀取數據(事務開啟)時,不再允許修改操作。
4、Serializable(序列化)在該級別下,事務串行化順序執行,可以避免臟讀、不可重復讀與幻讀。是最高的事務隔離級別,但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。
相關閱讀
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習