激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

Java程序員面試題

時(shí)間:2024-10-23 07:29:27 SUN認證 我要投稿

Java程序員面試題集錦

  Java面試隨著(zhù)時(shí)間的改變而改變。在過(guò)去的日子里,當你知道String和StringBuilder的區別就能讓你直接進(jìn)入第二輪面試,但是現在問(wèn)題變得越來(lái)越高級,面試官問(wèn)的問(wèn)題也更深入。下面是小編整理的關(guān)于Java程序員面試題集錦,希望大家認真閱讀!

Java程序員面試題集錦

  1)Java中能創(chuàng )建Volatile數組嗎?

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

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

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

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

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

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

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

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

  從寫(xiě)代碼的角度來(lái)說(shuō),兩者的復雜度是相同的,因為同步代碼與線(xiàn)程數量是相互獨立的。但是同步策略的選擇依賴(lài)于線(xiàn)程的數量,因為越多的線(xiàn)程意味著(zhù)更大的競爭,所以你需要利用同步技術(shù),如鎖分離,這要求更復雜的代碼和專(zhuān)業(yè)知識。

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

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

  參見(jiàn)EffectiveJava第69條,獲取更多關(guān)于為什么應該在循環(huán)中來(lái)調用wait方法的內容。

  7)Java中應該使用什么數據類(lèi)型來(lái)代表價(jià)格?(答案)

  如果不是特別關(guān)心內存和性能的話(huà),使用BigDecimal,否則使用預定義精度的double類(lèi)型。

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

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

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

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

  10)Swing是線(xiàn)程安全的?(答案)

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

  11)什么是線(xiàn)程局部變量?(答案)

  線(xiàn)程局部變量是局限于線(xiàn)程內部的變量,屬于線(xiàn)程自身所有,不在多個(gè)線(xiàn)程間共享。Java提供ThreadLocal類(lèi)來(lái)支持線(xiàn)程局部變量,是一種實(shí)現線(xiàn)程安全的方式。但是在管理環(huán)境下(如web服務(wù)器)使用線(xiàn)程局部變量的時(shí)候要特別小心,在這種情況下,工作線(xiàn)程的生命周期比任何應用變量的生命周期都要長(cháng)。任何線(xiàn)程局部變量一旦在工作完成后沒(méi)有釋放,Java應用就存在內存泄露的風(fēng)險。

  12)用wait-notify寫(xiě)一段代碼來(lái)解決生產(chǎn)者-消費者問(wèn)題?(答案)

  請參考答案中的示例代碼。只要記住在同步塊中調用wait()和notify()方法,如果阻塞,通過(guò)循環(huán)來(lái)測試等待條件。

  13)用Java寫(xiě)一個(gè)線(xiàn)程安全的單例模式(Singleton)?(答案)

  請參考答案中的示例代碼,這里面一步一步教你創(chuàng )建一個(gè)線(xiàn)程安全的Java單例類(lèi)。當我們說(shuō)線(xiàn)程安全時(shí),意思是即使初始化是在多線(xiàn)程環(huán)境中,仍然能保證單個(gè)實(shí)例。Java中,使用枚舉作為單例類(lèi)是最簡(jiǎn)單的方式來(lái)創(chuàng )建線(xiàn)程安全單例模式的方式。

  14)Java中sleep方法和wait方法的區別?(答案)

  雖然兩者都是用來(lái)暫停當前運行的線(xiàn)程,但是sleep()實(shí)際上只是短暫停頓,因為它不會(huì )釋放鎖,而wait()意味著(zhù)條件等待,這就是為什么該方法要釋放鎖,因為只有這樣,其他等待的線(xiàn)程才能在滿(mǎn)足條件時(shí)獲取到該鎖。

  15)什么是不可變對象(immutableobject)?Java中怎么創(chuàng )建一個(gè)不可變對象?(答案)

  不可變對象指對象一旦被創(chuàng )建,狀態(tài)就不能再改變。任何修改都會(huì )創(chuàng )建一個(gè)新的對象,如String、Integer及其它包裝類(lèi)。詳情參見(jiàn)答案,一步一步指導你在Java中創(chuàng )建一個(gè)不可變的類(lèi)。

【Java程序員面試題】相關(guān)文章:

java程序員面試題10-05

java初級程序員面試題「經(jīng)典」09-05

Java程序員面試題及答案07-19

2017年Java程序員面試題集07-24

Java程序員集合框架面試題及答案10-25

2017年Java程序員面試題及答案07-01

java面試題及答案11-01

經(jīng)典的Java基礎面試題09-02

華為Java面試題精選10-13

java基礎面試題201708-28

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频