【阿里巴巴】一面面試題彙總

  • 操作系統進程間通信
  1. 管道通信:管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關係的進程間使用。具有進程的親緣關係通常是具有父子進程間的關係。
  2. 命名管道FIFO:命名管道也是一種半雙工的通信方式,但他允許無親緣關係進程間的通信。
  3. 消息隊列MessageQueue:消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞量少、管道只能承載無格式字符流以及緩衝區大小受限等缺點。
  4. 共享存儲ShareMemeory:共享存儲就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的IPC方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。
  5. 信號量Semaphore:信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作爲進程間以及同一進程內不同線程之間的同步手段。
  6. 套接字(Socket):套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同及其間的進程通信。
  7. 信號(sinal):信號是一種比較複雜的通信方式,用於通知接收進程某個時間已經發生。
  • java保證線程間同步的方法

1.synchronized關鍵字,修飾方法,保證此方法只會有一個對象訪問。修飾代碼塊。被該關鍵字修飾的語句塊會自動被加上內置鎖,從而實現同步。
2.wait()與notify
wait():使一個對象處於等待狀態,並且釋放所持有對象的lock。
sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。
notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先級。
ALLnotify():喚醒所有初入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們去競爭。
3.使用特殊域變量(volatile)實現線程同步
1.volatile關鍵字爲域變量的訪問提供了一種免鎖機制
2.使用volatile修飾域相當於告訴虛擬機該域可能會被其他線程更新。
3.因此每次使用該域就要重新計算,而不是使用寄存器中的值。
4.volatile不會提供任何原子操作,他也不能用來修飾final類型的變量。
5.使用方法:在互斥變量前加上volatile關鍵字修飾即可。

  • mysql的聚簇索引與非聚簇索引

聚簇是根據碼值找到數據的物理存儲位置,從而達到快速檢索數據的目的。聚簇索引的順序就是數據的物理存儲順序,葉節點就是數據節點。非聚簇索引的順序與物理排列順序無關,葉節點仍然是索引節點,只不過有一個指針指向對應的數據塊。。一個表最多隻能有一個聚簇索引。
但是建立聚簇索引的空間耗費比較大對以後的增加刪除的影響比較大,所以在有必要的情況下用。

  • java中List和Set的區別

list與set方法的區別:list可以允許重複對象和插入多個null值,而set不允許;list容器是有序的,而set容器是無序的等待。

  • 事務的併發問題

1.髒讀:事務A讀取了事務B更新的數據,然後B回滾操作,那麼A讀取到的數據是髒數據。
2.不可重複讀:事務 A多次讀取同一數據,事務B在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果不一致。
3.幻讀:系統管理員A將數據庫中的所有學生的成績從具體分數改爲ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻讀一樣,這就叫幻讀。
小結:不可重複讀和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。

-數據庫四種事務的隔離級別

數據庫事務的隔離級別有4種,由低到高分別是:Read uncommitted、Read committed、Repeatablead、Serializable
1.Read uncommitted(讀未提交)
一個事務可能讀取了另一個未提交事務的數據。
eg:
老闆要給程序員發工資,程序員的工資是3.6萬/月。但是發工資時老闆不小心按錯了數字,按成3.9萬/月,該錢已經打到程序員的戶口,但是事務還沒有提交,就在這時,程序員去查看自己這個月的工資,發現比往常多了3千元,以爲漲工資了非常高興。但是老闆及時發現了不對,馬上回滾差點就提交了的事務,將數字改成3.6萬再提交。
分析:
實際程序員這個月工資還是3.6萬,但是程序員看到的是3.9萬,他看到的是老闆沒提交事物的數據。就是髒讀。
解決方法:Read commited讀提交,能解決髒讀問題。

2.Read commited(讀已提交)
eg:
程序員拿着信用卡去享受生活(卡里當然是只有3.6萬),當他埋單時(程序員事務開啓),收費系統事先檢測到他的卡里有3.6萬,就在這個時候!!程序員的妻子要把錢全部轉出充當家用,並提交。當收費系統準備扣款時,再檢測卡里的金額,發現已經沒錢了(第二次檢測金額當然要等待妻子轉出金額事務提交完)。程序員就會很鬱悶,明明卡里是有錢的…
分析:
這就是讀提交,若有事務對數據進行更新(UPDATE)操作時,讀操作事物要等這個更新操作事物提交才能讀取數據,可以解決髒讀問題。但在這個示例中,出現了一個事物範圍內兩個相同的查詢卻返回了不同數據,這就是不可重複讀。
解決方法:Repeatable read

3.Repeatable read
重複讀,就是在開始讀取數據(事務開啓)時,不再允許修改操作。MySQL是這一級別。
eg:
程序員拿着信用卡去享受生活(卡里當然是只有3.6萬),當他埋單時(事務開啓,不允許其他事務的UPDATE修改操作),收費系統事先檢測到他的卡里有3.6萬。這個時候他的妻子不能轉出金額了。接下來收費系統就可以扣款了。
分析:
重複讀可以解決不可重複讀問題。寫到這裏,應該明白一點就是,不可重複讀對應的是修改 UPDATE操作。但是可能會有幻讀問題。因爲幻讀問題對應的是插入INSERT操作,而不是UPDATE操作。
什麼時候出現幻讀?
eg:
程序員某一天消費,花了2千元,然後他的妻子去查看他今天的消費記錄(全表掃描FTS,妻子事物開啓),看到確實是花了2千元,就在這個時候,程序員花了1萬元買了一臺電腦,即新增INSERT了一條消費記錄,並提交。當妻子打印程序員的消費記錄清單時(妻子提交事務),發現花了1.2萬元,似乎出現了幻讀,就是幻讀。
解決:Serializable
1.Serializable序列化
Serializable是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免髒讀,不可重複讀與幻讀。但是在這種事務隔離級別效率低下,比較消耗數據庫性能,一般不用。
大多數數據庫默認的事務隔離級別是Read committed 、比如 Sql Server ,Oracle.Mysql的默認級別是Repeatable read

  • 接口和抽象類有什麼區別,你選擇使用接口和抽象類的依據是什麼?

接口和抽象類的概念不一樣,接口是對動作的抽象,抽象類是對根源的抽象。
抽象類表示的是,這個對象是什麼。接口表示的是,這個對象能做什麼。比如,男人,女人,這兩個類,他們的抽象類是人。說明,他們都是人。
人可以喫東西,狗也可以喫東西,你可以把“喫東西”定義成一個接口,然後讓這些類去實現它。
所以,在高級語言上,一個類只能繼承一個類(抽象類)(正如人不可能同時是生物和非生物),但是卻可以實現多個接口(喫飯接口、動作接口)。
總結:

  1. 抽象類和接口都不能直接實例化,如果要實例化,抽象類變量必須指向實現所有抽象方法的子類對象,接口變量必須指向實現所有接口方法的類對象。
  2. 抽象類要被子類繼承,接口要被類實現。
  3. 接口只能做方法聲明,抽象類中既可以做方法聲明,也可以做方法實現。
  4. 接口裏定義的變量只能是公共的靜態的變量,抽象類中的變量只能是普通的變量。
  5. 抽象類中的所有方法必須全部被子類所實現,如果子類不能全部是心啊父類的抽象方法,那麼該子類只能是抽象類。同樣,一個實現接口的時候,如不能全部實現接口方法,那麼該類也只能爲抽象類。
  6. 抽象方法只能聲明,不能實現,接口是設計的結果,抽象類是重構的結果。
  7. 抽象類裏可以沒有抽象方法。
  8. 如果一個類裏有抽象方法,那麼這個類只能是抽象類。
  9. 抽象方法要被實現,所以不能是靜態的,也不能是私有的。
  10. 接口可繼承接口,並可多繼承接口,但類只能單根繼承。
  • 什麼是死鎖?死鎖的四個必要條件

死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程成爲死鎖進程。
四個必要條件:
1.互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程佔用。如果此時還有其他進程請求資源,則請求者只能等待,直至佔有資源的進程用畢釋放。
2. 請求與保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源已經被其他資源佔有,此時請求進程被阻塞,但對自己已獲得的資源保持不放。
3. 不可剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能由獲得該資源的進程自己來釋放(只能是主動釋放)
4. 循環等待條件:指在發生死鎖時,必然存在一個進程——資源的環形練,即進程集合{P0,P1,P2,。。。Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,。。。Pn正在等待已被P0佔用的資源。
這四個條件時死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。

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