新年第一期面試題,2020年面試題不能拉

碼個蛋 發佈 2020-01-06T03:31:47+00:00

碼個蛋(codeegg) 第 851 次推文開獎啦!福利時間元旦福利抽獎開獎啦!在留言區參加活動的朋友中,恭喜彬,過客,玉米3位朋友獲得。請聯繫碼仔領獎。加微信:lx409070956,備註中獎。1.

碼個蛋(codeegg) 第 851 次推文

開獎啦!福利時間

元旦福利抽獎開獎啦!在留言區參加活動的朋友中,恭喜過客玉米3位朋友獲得。請聯繫碼仔領獎。加微信:lx409070956,備註中獎

1. 談談wait/notify關鍵字的理解

概念:鎖池和等待池:一、鎖池:假設線程A已經擁有了某個對象(注意:不是類)的鎖,而其它的線程想要調用這個對象的某個synchronized方法(或者synchronized塊),由於這些線程在進入對象的synchronized方法之前必須先獲得該對象的鎖的擁有權,但是該對象的鎖目前正被線程A擁有,所以這些線程就進入了該對象的鎖池中。二、等待池:假設一個線程A調用了某個對象的wait方法,線程A就會釋放該對象的鎖後,進入到了該對象的等待池中。

notify和notifyAll的區別:

、如果線程調用了對象的 wait方法,那麼線程便會處於該對象的等待池中,等待池中的線程不會去競爭該對象的鎖。

、當有線程調用了對象的notifyAll方法(喚醒所有 wait 線程)或 notify方法(只隨機喚醒一個 wait 線程),被喚醒的的線程便會進入該對象的鎖池中,鎖池中的線程會去競爭該對象鎖。也就是說,調用了notify後只要一個線程會由等待池進入鎖池,而notifyAll會將該對象等待池內的所有線程移動到鎖池中,等待鎖競爭。

、優先級高的線程競爭到對象鎖的機率大,假若某線程沒有競爭到該對象鎖,它還會留在鎖池中,唯有線程再次調用 wait方法,它才會重新回到等待池中。而競爭到對象鎖的線程則繼續往下執行,直到執行完了synchronized 代碼塊,它會釋放掉該對象鎖,這時鎖池中的線程會繼續競爭該對象鎖。

2. 假如try{}里有一個return語句?

問:try{}里有一個return語句,那麼緊跟在這個try後的finally{}里的代碼會不會被執行,什麼時候被執行,在return前還是後?

答:會執行,在方法返回前執行。在finally中改變返回值的做法是不好的,因為如果存在finally代碼塊,try中的return語句不會立馬返回調用者,而是記錄下返回值待finally代碼塊執行完畢之後再向調用者返回其值,然後如果在finally中修改了返回值,就會返回修改後的值。

3. 有n多個布爾值,如何判斷?

問:有五個布爾值,當全為true時或全為false時為true,其他為false,如何判斷?當有n個時呢?

方法一:

/**
* @return true:全為true或全為false,
* false:有一個不同時。
*/
public static boolean checkSameBoolean(List<Boolean> list) {
int m = 0;
for (int i = 0; i < list.size; i++) {
Boolean aBoolean = list.get(i);
if (aBoolean) {
m++;
} else {
m--;
}
}
return Math.abs(m) == list.size;
}

方法二:

fun checkSameBoolean(values: MutableList<Boolean>): Boolean {
require(values.isNotEmpty) { "List can't be empty" }

val first = values[0]

values.filterNot { it == first }.forEach { _ -> return false }

return true
}
4. 為什麼wait, notify和notifyAll

必須在同步方法或者同步塊中被調用?

當一個線程需要調用對象的wait方法的時候,這個線程必須擁有該對象的鎖,接著它就會釋放這個對象鎖並進入等待狀態直到其他線程調用這個對象上的notify方法。同樣的,當一個線程需要調用對象的notify方法時,它會釋放這個對象的鎖,以便其他在等待的線程就可以得到這個對象鎖。由於所有的這些方法都需要線程持有對象的鎖,這樣就只能通過同步來實現,所以他們只能在同步方法或者同步塊中被調用。

5. 多線程和單線程的區別和聯繫?

在單核 CPU 中,將 CPU 分為很小的時間片,在每一時刻只能有一個線程在執行,是一種微觀上輪流占用 CPU 的機制。

多線程會存在線程上下文切換,會導致程序執行速度變慢,即採用一個擁有兩個線程的進程執行所需要的時間比一個線程的進程執行兩次所需要的時間要多一些。

結論:即採用多線程不會提高程序的執行速度,反而會降低速度,但是對於用戶來說,可以減少用戶的響應時間

是不是好久沒看面試題了?

專屬升級社區:《這件事情,我終於想明白了》

關鍵字: