2020年一線互聯(lián)網(wǎng)Java高級(jí)面試題

2020年一線互聯(lián)網(wǎng)Java高級(jí)面試題

長(zhǎng)沙中公優(yōu)就業(yè)      2022-04-26 05:28:01     8

2020年一線互聯(lián)網(wǎng)Java高級(jí)面試題,  1)Java中能創(chuàng)建volatile數(shù)組嗎?  能,Java中可以創(chuàng)建volatile類(lèi)型數(shù)組,不過(guò)只是一個(gè)指向數(shù)組的引用,而不是整個(gè)數(shù)組。

課程價(jià)格 請(qǐng)咨詢(xún)

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹



  1)Java中能創(chuàng)建volatile數(shù)組嗎?


  能,Java中可以創(chuàng)建volatile類(lèi)型數(shù)組,不過(guò)只是一個(gè)指向數(shù)組的引用,而不是整個(gè)數(shù)組。我的意思是,如果改變引用指向的數(shù)組,將會(huì)受到volatile的保護(hù),但是如果多個(gè)線程同時(shí)改變數(shù)組的元素,volatile標(biāo)示符就不能起到之前的保護(hù)作用了。


  2)volatile能使得一個(gè)非原子操作變成原子操作嗎?


  一個(gè)典型的例子是在類(lèi)中有一個(gè)long類(lèi)型的成員變量。如果你知道該成員變量會(huì)被多個(gè)線程訪問(wèn),如計(jì)數(shù)器、價(jià)格等,你最好是將其設(shè)置為volatile。為什么?因?yàn)镴ava中讀取long類(lèi)型變量不是原子的,需要分成兩步,如果一個(gè)線程正在修改該long變量的值,另一個(gè)線程可能只能看到該值的一半(前32位)。但是對(duì)一個(gè)volatile型的long或double變量的讀寫(xiě)是原子。


  3)volatile修飾符的有過(guò)什么實(shí)踐?


  一種實(shí)踐是用volatile修飾long和double變量,使其能按原子類(lèi)型來(lái)讀寫(xiě)。double和long都是64位寬,因此對(duì)這兩種類(lèi)型的讀是分為兩部分的,第一次讀取第一個(gè)32位,然后再讀剩下的32位,這個(gè)過(guò)程不是原子的,但Java中volatile型的long或double變量的讀寫(xiě)是原子的。volatile修復(fù)符的另一個(gè)作用是提供內(nèi)存屏障(memorybarrier),例如在分布式框架中的應(yīng)用。簡(jiǎn)單的說(shuō),就是當(dāng)你寫(xiě)一個(gè)volatile變量之前,Java內(nèi)存模型會(huì)插入一個(gè)寫(xiě)屏障(writebarrier),讀一個(gè)volatile變量之前,會(huì)插入一個(gè)讀屏障(readbarrier)。意思就是說(shuō),在你寫(xiě)一個(gè)volatile域時(shí),能保證任何線程都能看到你寫(xiě)的值,同時(shí),在寫(xiě)之前,也能保證任何數(shù)值的更新對(duì)所有線程是可見(jiàn)的,因?yàn)閮?nèi)存屏障會(huì)將其他所有寫(xiě)的值更新到緩存。


  4)volatile類(lèi)型變量提供什么保證?


  volatile變量提供順序和可見(jiàn)性保證,例如,JVM或者JIT為了獲得更好的性能會(huì)對(duì)語(yǔ)句重排序,但是volatile類(lèi)型變量即使在沒(méi)有同步塊的情況下賦值也不會(huì)與其他語(yǔ)句重排序。volatile提供happens-before的保證,確保一個(gè)線程的修改能對(duì)其他線程是可見(jiàn)的。某些情況下,volatile還能提供原子性,如讀64位數(shù)據(jù)類(lèi)型,像long和double都不是原子的,但volatile類(lèi)型的double和long就是原子的。


  5)10個(gè)線程和2個(gè)線程的同步代碼,哪個(gè)更容易寫(xiě)?


  從寫(xiě)代碼的角度來(lái)說(shuō),兩者的復(fù)雜度是相同的,因?yàn)橥酱a與線程數(shù)量是相互獨(dú)立的。但是同步策略的選擇依賴(lài)于線程的數(shù)量,因?yàn)樵蕉嗟木€程意味著更大的競(jìng)爭(zhēng),所以你需要利用同步技術(shù),如鎖分離,這要求更復(fù)雜的代碼和專(zhuān)業(yè)知識(shí)。


  6)你是如何調(diào)用wait()方法的?使用if塊還是循環(huán)?為什么?


  wait()方法應(yīng)該在循環(huán)調(diào)用,因?yàn)楫?dāng)線程獲取到CPU開(kāi)始執(zhí)行的時(shí)候,其他條件可能還沒(méi)有滿(mǎn)足,所以在處理前,循環(huán)檢測(cè)條件是否滿(mǎn)足會(huì)更好。下面是一段標(biāo)準(zhǔn)的使用wait和notify方法的代碼:


  //Thestandardidiomforusingthewaitmethod


  synchronized(obj){


  while(conditiondoesnothold)


  obj.wait();//(Releaseslock,andreacquiresonwakeup)


  ...//Performactionappropriatetocondition


  }


  7)什么是多線程環(huán)境下的偽共享(falsesharing)?


  偽共享是多線程系統(tǒng)(每個(gè)處理器有自己的局部緩存)中一個(gè)眾所周知的性能問(wèn)題。偽共享發(fā)生在不同處理器的上的線程對(duì)變量的修改依賴(lài)于相同的緩存行,如下圖所示:



  8)什么是Busyspin?我們?yōu)槭裁匆褂盟?/strong>


  Busyspin是一種在不釋放CPU的基礎(chǔ)上等待事件的技術(shù)。它經(jīng)常用于避免丟失CPU緩存中的數(shù)據(jù)(如果線程先暫停,之后在其他CPU上運(yùn)行就會(huì)丟失)。所以,如果你的工作要求低延遲,并且你的線程目前沒(méi)有任何順序,這樣你就可以通過(guò)循環(huán)檢測(cè)隊(duì)列中的新消息來(lái)代替調(diào)用sleep()或wait()方法。它唯一的好處就是你只需等待很短的時(shí)間,如幾微秒或幾納秒。LMAX分布式框架是一個(gè)高性能線程間通信的庫(kù),該庫(kù)有一個(gè)BusySpinWaitStrategy類(lèi)就是基于這個(gè)概念實(shí)現(xiàn)的,使用busyspin循環(huán)EventProcessors等待屏障。


  9)Java中怎么獲取一份線程dump文件?


  在Linux下,你可以通過(guò)命令kill-3PID(Java進(jìn)程的進(jìn)程ID)來(lái)獲取Java應(yīng)用的dump文件。在Windows下,你可以按下Ctrl+Break來(lái)獲取。這樣JVM就會(huì)將線程的dump文件打印到標(biāo)準(zhǔn)輸出或錯(cuò)誤文件中,它可能打印在控制臺(tái)或者日志文件中,具體位置依賴(lài)應(yīng)用的配置。如果你使用Tomcat。


  10)Swing是線程安全的?


  不是,Swing不是線程安全的。你不能通過(guò)任何線程來(lái)更新Swing組件,如JTable、JList或JPanel,事實(shí)上,它們只能通過(guò)GUI或AWT線程來(lái)更新。這就是為什么Swing提供invokeAndWait()和invokeLater()方法來(lái)獲取其他線程的GUI更新請(qǐng)求。這些方法將更新請(qǐng)求放入AWT的線程隊(duì)列中,可以一直等待,也可以通過(guò)異步更新直接返回結(jié)果。你也可以在參考答案中查看和學(xué)習(xí)到更詳細(xì)的內(nèi)容。



      以上就是長(zhǎng)沙中公優(yōu)就業(yè)Java培訓(xùn)機(jī)構(gòu)小編介紹的“2020年一線互聯(lián)網(wǎng)Java高級(jí)面試題”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。


培訓(xùn)啦提醒您:交易時(shí)請(qǐng)核實(shí)對(duì)方資質(zhì),對(duì)于過(guò)大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。