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