知了堂Java|Java基礎(chǔ)面試題(五)




17.什么情況下導(dǎo)致線程死鎖,遇到線程死鎖該怎么解決??
死鎖的定義:所謂死鎖是指多個線程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些 進(jìn)程都將無法向前推進(jìn)。?
死鎖產(chǎn)生的必要條件:?
互斥條件:線程要求對所分配的資源(如打印機(jī))進(jìn)行排他性控制,即在一段時間內(nèi)某 資源僅為 一個線程所占有。此時若有其他線程請求該資源,則請求線程只能等待。?
不剝奪條件:線程所獲得的資源在未使用完畢之前,不能被其他線程強(qiáng)行奪走,即只能由獲得該資 源的線程自己來釋放(只能是主動釋放)。?
請求和保持條件:線程已經(jīng)保持了至少一個資源,但又提出了新的資源請求,而該資源已被其他線 程占有,此時請求進(jìn)程被阻塞,但對自己已獲得的資源保持不放。?
循環(huán)等待條件:存在一種線程資源的循環(huán)等待鏈,鏈中每一個線程已獲得的資源同時被鏈中下一個 線程所請求。即存在一個處于等待狀態(tài)的線程集合{Pl, P2, ..., pn},其中 Pi 等待的資源被 P(i+1)占 有(i=0, 1, ..., n-1),Pn 等待的資源被 P0 占有,
在有些情況下死鎖是可以避免的。兩種用于避免死鎖的技術(shù):
加鎖順序(線程按照一定的順序加鎖)
加鎖時限(線程嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,并釋放自己占 有的鎖)
18.HashMap 和 Hashtable 有什么區(qū)別?
hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey() 方法。?
hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。?
hashMap允許空鍵值,而hashTable不允許
19.說一下 HashMap 的實(shí)現(xiàn)原理
HashMap概述: HashMap是基于哈希表的Map接口的非同步實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作, 并允許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恒久不變。
HashMap的數(shù)據(jù)結(jié)構(gòu): 在java編程語言中,最基本的結(jié)構(gòu)就是兩種,一個是數(shù)組,另外一個是模擬指 針(引用),所有的數(shù)據(jù)結(jié)構(gòu)都可以用這兩個基本結(jié)構(gòu)來構(gòu)造的,HashMap也不例外。HashMap實(shí)際 上是一個“鏈表散列”的數(shù)據(jù)結(jié)構(gòu),即數(shù)組和鏈表的結(jié)合體。
當(dāng)我們往Hashmap中put元素時,首先根據(jù)key的hashcode重新計(jì)算hash值,根絕hash值得到這個元素在 數(shù)組中的位置(下標(biāo)),如果該數(shù)組在該位置上已經(jīng)存放了其他元素,那么在這個位置上的元素將以鏈表的形 式存放,新加入的放在鏈頭,最先加入的放入鏈尾.如果數(shù)組中該位置沒有元素,就直接將該元素放到數(shù)組的 該位置上。
需要注意Jdk 1.8中對HashMap的實(shí)現(xiàn)做了優(yōu)化,當(dāng)鏈表中的節(jié)點(diǎn)數(shù)據(jù)超過八個之后,該鏈表會轉(zhuǎn)為紅黑樹 來提高查詢效率,從原來的O(n)到O(logn)
今天的分享就到這里啦,持續(xù)關(guān)注我們,學(xué)習(xí)更多Java干貨知識。??