<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          阿里-測(cè)試開發(fā)面經(jīng)(十)

          共 4452字,需瀏覽 9分鐘

           ·

          2021-05-09 22:16

          點(diǎn)擊藍(lán)字關(guān)注我們,獲取更多面經(jīng)








          短連接和長(zhǎng)連接




          短連接 

          連接->傳輸數(shù)據(jù)->關(guān)閉連接 

          比如HTTP是無(wú)狀態(tài)的的短鏈接,瀏覽器和服務(wù)器每進(jìn)行一次HTTP操作,就建立一次連接,但任務(wù)結(jié)束就中斷連接。 

          具體就是 瀏覽器client發(fā)起并建立TCP連接 -> client發(fā)送HttpRequest報(bào)文 -> server接收到報(bào)文->server handle并發(fā)送HttpResponse報(bào)文給前端,發(fā)送完畢之后立即調(diào)用socket.close方法->client接收response報(bào)文->client最終會(huì)收到server端斷開TCP連接的信號(hào)->client 端斷開TCP連接,具體就是調(diào)用close方法。 

          也可以這樣說(shuō):短連接是指SOCKET連接后,發(fā)送接收完數(shù)據(jù)后馬上斷開連接。因?yàn)檫B接后接收了數(shù)據(jù)就斷開了,所以每次數(shù)據(jù)接受處理不會(huì)有聯(lián)系。這也是HTTP協(xié)議無(wú)狀態(tài)的原因之一。


          長(zhǎng)連接 

          連接->傳輸數(shù)據(jù)->保持連接 -> 傳輸數(shù)據(jù)-> ………..->直到一方關(guān)閉連接,多是客戶端關(guān)閉連接。長(zhǎng)連接指建立SOCKET連接后不管是否使用都保持連接,但安全性較差。HTTP在短鏈接和長(zhǎng)連接上的選擇:HTTP是無(wú)狀態(tài)的 ,也就是說(shuō),瀏覽器和服務(wù)器每進(jìn)行一次HTTP操作,就建立一次連接,但任務(wù)結(jié)束就中斷連接。如果客戶端瀏覽器訪問(wèn)的某個(gè)HTML或其他類型的 Web頁(yè)中包含有其他的Web資源,如JavaScript文件、圖像文件、CSS文件等;當(dāng)瀏覽器每遇到這樣一個(gè)Web資源,就會(huì)建立一個(gè)HTTP會(huì)話 

          HTTP1.1和HTTP1.0相比較而言,最大的區(qū)別就是增加了持久連接支持(貌似最新的HTTP1.1 可以顯示的指定 keep-alive),但還是無(wú)狀態(tài)的,或者說(shuō)是不可以信任的。 

          如果瀏覽器或者服務(wù)器在其頭信息加入了這行代碼 Connection:keep-alive TCP連接在發(fā)送后將仍然保持打開狀態(tài),于是,瀏覽器可以繼續(xù)通過(guò)相同的連接發(fā)送請(qǐng)求。保持連接節(jié)省了為每個(gè)請(qǐng)求建立新連接所需的時(shí)間,還節(jié)約了帶寬。 

          實(shí)現(xiàn)長(zhǎng)連接要客戶端和服務(wù)端都支持長(zhǎng)連接。


          優(yōu)缺點(diǎn)

          tcp長(zhǎng)連接優(yōu)缺點(diǎn):長(zhǎng)連接可以省去較多的tcp建立/關(guān)閉的操作,減少浪費(fèi),節(jié)省時(shí)間,對(duì)于頻繁請(qǐng)求資源的客戶,較適用于長(zhǎng)連接;client和server如果長(zhǎng)時(shí)間不關(guān)閉的話,會(huì)存在一個(gè)問(wèn)題,隨著客戶的越來(lái)越多,server早晚會(huì)有扛不住的一天,這時(shí)需要采取一些策略,如關(guān)閉一些長(zhǎng)時(shí)間不讀寫操作的連接,這樣可以避免一些惡意連接導(dǎo)致server端服務(wù)受損,如果條件再允許,就可以以客戶端為顆粒度,限制每個(gè)客戶端的最大連接數(shù)


          tcp短連接優(yōu)缺點(diǎn):短連接對(duì)于服務(wù)器來(lái)說(shuō)較為簡(jiǎn)單,存在的連接都是有用的連接,不需要額外的控制,但如果客戶端連接頻繁,會(huì)在tcp的建立和關(guān)閉上浪費(fèi)時(shí)間。






          單例模式雙重加鎖




          public class Singleton {

          //沒(méi)有volatile線程可能訪問(wèn)到的是一個(gè)沒(méi)有初始化的對(duì)象 private volatile static Singleton instance; private Singleton() { } public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { //靜態(tài)方法的同步鎖為類的class對(duì)象,即Singleton.class if (instance == null) { instance = new Singleton(); } } } return instance; }}


          注:通過(guò)第8行判斷的每個(gè)線程會(huì)依次獲得鎖進(jìn)入臨界區(qū),所以進(jìn)入臨界區(qū)后還要再判斷一次單例類是否已被其它線程實(shí)例化,以避免多次實(shí)例化。由于雙重加鎖實(shí)現(xiàn)僅在實(shí)例化單例類時(shí)需要加鎖,所以會(huì)帶來(lái)性能上的提升。另外需要注意的是雙重加鎖要對(duì) instance 域加上 volatile 修飾符。由于 synchronized 并不是對(duì) instance 實(shí)例進(jìn)行加鎖(因?yàn)楝F(xiàn)在還并沒(méi)有實(shí)例),所以線程在執(zhí)行完第11行修改 instance 的值后,應(yīng)該將修改后的 instance 立即寫入主存(main memory),而不是暫時(shí)存在寄存器或者高速緩沖區(qū)(caches)中,以保證新的值對(duì)其它線程可見,避免其他線程進(jìn)行初始化。


          volatile關(guān)鍵字的作用:

          實(shí)例化對(duì)象的那行代碼( instance = new Singleton();),實(shí)際上可以分解成以下三個(gè)步驟:

          1.分配內(nèi)存空間

          2.初始化對(duì)象

          3.將對(duì)象指向剛分配的內(nèi)存空間


          但是有些編譯器為了性能的原因,可能會(huì)將第二步和第三步進(jìn)行重排序,順序就成了:

          1.分配內(nèi)存空間

          2.將對(duì)象指向剛分配的內(nèi)存空間

          3.初始化對(duì)象

          現(xiàn)在考慮重排序后,兩個(gè)線程發(fā)生了以下調(diào)用:

          Time Thread A Thread B

          T1 檢查到uniqueSingleton為空

          T2 獲取鎖

          T3 再次檢查到uniqueSingleton為空

          T4 為uniqueSingleton分配內(nèi)存空間

          T5 將uniqueSingleton指向內(nèi)存空間

          T6 檢查到uniqueSingleton不為空

          T7 訪問(wèn)uniqueSingleton(此時(shí)對(duì)象還未完成初始化)

          T8 初始化uniqueSingleton


          在這種情況下,T7時(shí)刻線程B對(duì)uniqueSingleton的訪問(wèn),訪問(wèn)的是一個(gè)初始化未完成的對(duì)象。


          解決:使用volatile關(guān)鍵字修飾instance對(duì)象,使用了volatile關(guān)鍵字后,重排序被禁止,上述編譯器為了性能優(yōu)化進(jìn)行的重排序行為就不允許發(fā)生了。






          C++的多態(tài)




          定義

          多態(tài)的定義簡(jiǎn)單來(lái)說(shuō)就是使一條語(yǔ)句有多種狀態(tài)。


          實(shí)現(xiàn)方式

          多態(tài)的實(shí)現(xiàn)方式分為三塊:重載、重寫、重定義。下面我們來(lái)談一談他們各自的實(shí)現(xiàn)方式和實(shí)現(xiàn)原理。


          重載

          實(shí)現(xiàn)方式

          重載是在同一作用域內(nèi)(不管是模塊內(nèi)還是類內(nèi),只要是在同一作用域內(nèi)),具有相同函數(shù)名,不同的形參個(gè)數(shù)或者形參類型。返回值可以相同也可以不同(在函數(shù)名、形參個(gè)數(shù)、形參類型都相同而返回值類型不同的情況下無(wú)法構(gòu)成重載,編譯器報(bào)錯(cuò)。這個(gè)道理很簡(jiǎn)單,在函數(shù)調(diào)用的時(shí)候是不看返回值類型的)。


          實(shí)現(xiàn)原理

          重載是一種靜態(tài)多態(tài),即在編譯的時(shí)候確定的。C++實(shí)現(xiàn)重載的方式是跟編譯器有關(guān),編譯過(guò)后C++的函數(shù)名會(huì)發(fā)生改變,會(huì)帶有形參個(gè)數(shù)、類型以及返回值類型的信息(雖然帶有返回值類型但是返回值類型不能區(qū)分這個(gè)函數(shù)),所以編譯器能夠區(qū)分具有不同形參個(gè)數(shù)或者類型以及相同函數(shù)名的函數(shù)。插一句,在C語(yǔ)言中編譯器編譯過(guò)后函數(shù)名中不會(huì)帶有形參個(gè)數(shù)以及類型的信息,因此C語(yǔ)言沒(méi)有重載的特性。由此帶來(lái)麻煩的一點(diǎn)是如果想要在C++中調(diào)用C語(yǔ)言的庫(kù),需要特殊的操作(extern “C”{})。庫(kù)中的函數(shù)經(jīng)過(guò)C編譯器編譯的話會(huì)生成不帶有形參信息的函數(shù)名,而用C++的編譯器編譯過(guò)后會(huì)生成帶有形參信息的函數(shù)名,因此將會(huì)找不到這個(gè)函數(shù)。extern “C”{}的作用是使在這個(gè)作用域中的語(yǔ)句用C編譯器編譯,這樣就不會(huì)出錯(cuò)。這也是一種語(yǔ)言兼容性的問(wèn)題。


          重寫

          實(shí)現(xiàn)方式

          重寫是在不同作用域內(nèi)(一個(gè)在父類一個(gè)在子類),函數(shù)名、形參個(gè)數(shù)、形參類型、返回值類型都相同并且父類中帶有virtual關(guān)鍵字(換言之子類中帶不帶virtual都沒(méi)有關(guān)系)。有一種特殊的情況:函數(shù)返回值類型可以不同但是必須是指針或者引用,并且兩個(gè)虛函數(shù)的返回值之間必須要構(gòu)成父子類關(guān)系。這種情況稱之為協(xié)變,也是一種重寫。引入?yún)f(xié)變的好處是為了避免危險(xiǎn)的類型轉(zhuǎn)換。


          實(shí)現(xiàn)原理

          重寫是一種動(dòng)態(tài)多態(tài),即在運(yùn)行時(shí)確定的。C++實(shí)現(xiàn)重寫的方式也跟編譯器有關(guān),編譯器在實(shí)例化一個(gè)具有虛函數(shù)的類時(shí)會(huì)生成一個(gè)vptr指針(這就是為什么靜態(tài)函數(shù)、友元函數(shù)不能聲明為虛函數(shù),因?yàn)樗鼈儾粚?shí)例化也可以調(diào)用,而虛函數(shù)必須要實(shí)例化,這也是為什么構(gòu)造函數(shù)不能聲明為虛函數(shù),因?yàn)槟阋{(diào)用虛函數(shù)必須得要有vptr指針,而構(gòu)造函數(shù)此時(shí)還沒(méi)有被調(diào)用,內(nèi)存中還不存在vptr指針,邏輯上矛盾了)。vptr指針在類的內(nèi)存空間中占最低地址的四字節(jié)。vptr指針指向的空間稱為虛函數(shù)表,vptr指針指向其表頭,在虛函數(shù)表里面按聲明順序存放了虛函數(shù)的函數(shù)指針,如果在子類中重寫了,在子類的內(nèi)存空間中也會(huì)產(chǎn)生一個(gè)vptr指針,同時(shí)會(huì)把父類的虛函數(shù)表copy一下當(dāng)做自己的,然后如果在子類中重新聲明了虛函數(shù),會(huì)按聲明順序接在父類的虛函數(shù)函數(shù)指針下。而子類中重寫的虛函數(shù)則會(huì)替換掉虛函數(shù)表中原先父類的虛函數(shù)函數(shù)指針。重點(diǎn)來(lái)了,在調(diào)用虛函數(shù)時(shí),不管調(diào)用他的是父類的指針、引用還是子類的指針、引用,他都不管,只看他所指向或者引用的對(duì)象的類型(這也稱為動(dòng)態(tài)聯(lián)編),如果是父類的對(duì)象,那就調(diào)用父類里面的vptr指針然后找到相應(yīng)的虛函數(shù),如果是子類的對(duì)象,那就調(diào)用子類里面的vptr指針然后找到相應(yīng)的虛函數(shù)。當(dāng)然這樣子的過(guò)程相比靜態(tài)多態(tài)而言,時(shí)間和空間上的開銷都多了(這也是為什么內(nèi)聯(lián)函數(shù)為什么不能聲明為虛函數(shù),因?yàn)檫@和內(nèi)聯(lián)函數(shù)加快執(zhí)行速度的初衷相矛盾)。


          重定義

          實(shí)現(xiàn)方式

          重定義是在不同作用域內(nèi)的(一個(gè)在父類一個(gè)在子類),只要函數(shù)名相同,且不構(gòu)成重寫,均稱之為重定義


          實(shí)現(xiàn)原理

          重定義的實(shí)現(xiàn)原理跟繼承樹中函數(shù)的尋找方式有關(guān),他會(huì)從當(dāng)前對(duì)象的類作用域內(nèi)開始查找同名的函數(shù),如果沒(méi)有找到就一直向上查找直到基類為止。如果找到一個(gè)同名的函數(shù)就停止。這也就說(shuō)明他不管函數(shù)的形參類型或者個(gè)數(shù)是不是一樣,只要函數(shù)名一樣,他就認(rèn)為是找到了,如果這時(shí)候形參類型或者個(gè)數(shù)不一致,編譯器就會(huì)報(bào)錯(cuò)。多重繼承的查找,如果在同一層內(nèi)出現(xiàn)一樣的函數(shù)聲明那么編譯器會(huì)報(bào)錯(cuò)不知道調(diào)用哪一個(gè)函數(shù),這類問(wèn)題也叫鉆石繼承問(wèn)題。鉆石問(wèn)題的解決方案可以通過(guò)虛繼承來(lái)實(shí)現(xiàn),這樣就不會(huì)存在多個(gè)一樣的函數(shù)聲明。








          更多面經(jīng)





          360-測(cè)試開發(fā)面經(jīng)(一)


          百度-測(cè)試開發(fā)面經(jīng)(一)


          字節(jié)跳動(dòng)-測(cè)試開發(fā)面經(jīng)(一)


              掃描二維碼

             獲取更多面經(jīng)

            扶搖就業(yè)  


          瀏覽 41
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  三级视频在线观看网站 | 我不卡一区二区 | 做女人自拍视频在线播放 | 麻豆成人网一区二区 | 99热在线精品播放 |