阿里面試題目記錄

阿里面試題目記錄2018-10-09

題目一:
linux如何實現凌晨定時執行腳本?
Linux中,週期執行的任務一般由cron這個守護進程來處理。cron讀取一個或多個配置文件,這些配置文件中包含了命令行及其調用時間。cron的配置文件稱爲“crontab”,是“cron table”的簡寫。

題目二:
java如何實現多線程?線程的狀態有哪些?
java實現多線程有兩種方法
    1、繼承Thread類
    2、實現Runnable接口
    這兩種方法的共同點:
    不論用哪種方法,都必須用Thread(如果是Thead子類就用它本身)產生線程,然後再調用start()方法。

兩種方法的不同點:
1、繼承Thread類有一個缺點就是單繼承,而實現Runnable接口則彌補了它的缺點,可以實現多繼承
2、繼承Thread類必須如果產生Runnable實例對象,就必須產生多個Runnable實例對象,然後再用Thread產生多個線程;而實現Runnable接口,只需要建立一個實現這個類的實例,然後用這一個實例對象產生多個線程。即實現了資源的共享性

線程共有6種狀態:
NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED
分別對應於
新建、運行、阻塞、等待、帶超時的等待、終止

題目三:
如何做能保證線程安全?(進程安全是什麼?)
線程安全 
一般說來,確保線程安全的方法有這幾個:
競爭與原子操作、同步與鎖、可重入、過度優化。

競爭與原子操作 

多個線程同時訪問和修改一個數據,可能造成很嚴重的後果。出現嚴重後果的原因是很多操作被操作系統編譯爲彙編代碼之後不止一條指令,因此在執行的時候可能執行了一半就被調度系統打斷了而去執行別的代碼了。一般將單指令的操作稱爲原子的(Atomic),因爲不管怎樣,單條指令的執行是不會被打斷的。

因此,爲了避免出現多線程操作數據的出現異常,Linux系統提供了一些常用操作的原子指令,確保了線程的安全。但是,它們只適用於比較簡單的場合,在複雜的情況下就要選用其他的方法了。

同步與鎖 

爲了避免多個線程同時讀寫一個數據而產生不可預料的後果,開發人員要將各個線程對同一個數據的訪問同步,也就是說,在一個線程訪問數據未結束的時候,其他線程不得對同一個數據進行訪問。

同步的最常用的方法是使用鎖(Lock),它是一種非強制機制,每個線程在訪問數據或資源之前首先試圖獲取鎖,並在訪問結束之後釋放鎖;在鎖已經被佔用的時候試圖獲取鎖時,線程會等待,直到鎖重新可用。

二元信號量是最簡單的一種鎖,它只有兩種狀態:佔用與非佔用,它適合只能被唯一一個線程獨佔訪問的資源。對於允許多個線程併發訪問的資源,要使用多元信號量(簡稱信號量)。

可重入 
一個函數被重入,表示這個函數沒有執行完成,但由於外部因素或內部因素,又一次進入該函數執行。一個函數稱爲可重入的,表明該函數被重入之後不會產生任何不良後果。可重入是併發安全的強力保障,一個可重入的函數可以在多線程環境下放心使用。

過度優化 

在很多情況下,即使我們合理地使用了鎖,也不一定能夠保證線程安全,因此,我們可能對代碼進行過度的優化以確保線程安全。

我們可以使用volatile關鍵字試圖阻止過度優化,它可以做兩件事:第一,阻止編譯器爲了提高速度將一個變量緩存到寄存器而不寫回;第二,阻止編譯器調整操作volatile變量的指令順序。

在另一種情況下,CPU的亂序執行讓多線程安全保障的努力變得很困難,通常的解決辦法是調用CPU提供的一條常被稱作barrier的指令,它會阻止CPU將該指令之前的指令交換到barrier之後,反之亦然。

題目四:
查詢數據庫比較慢可能是哪些原因造成的?
1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是程序設計的缺陷)
2、I/O吞吐量小,形成了瓶頸效應。
3、沒有創建計算列導致查詢不優化。
4、內存不足
5、網絡速度慢
6、查詢出的數據量過大(可以採用多次查詢,其他的方法降低數據量)
7、鎖或者死鎖(這也是查詢慢最常見的問題,是程序設計的缺陷)
8、sp_lock,sp_who,活動的用戶查看,原因是讀寫競爭資源。
9、返回了不必要的行和列
10、查詢語句不好,沒有優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章