黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 Java學(xué)習(xí) Java程序員面試題大全含答案

Java程序員面試題大全含答案

更新時(shí)間:2019-12-19 15:50:40 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2993次

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

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

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

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

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

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

  volatile 類型變量提供什么保證?

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

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

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

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

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

Java程序員面試題大全含答案

  有經(jīng)驗(yàn)程序員的 Java 面試題

  偽共享問題很難被發(fā)現(xiàn),因?yàn)榫€程可能訪問完全不同的全局變量,內(nèi)存中卻碰巧在很相近的位置上。如其他諸多的并發(fā)問題,避免偽共享的最基本方式是仔細(xì)審查代碼,根據(jù)緩存行來調(diào)整你的數(shù)據(jù)結(jié)構(gòu)。

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

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

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

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

  Swing 是線程安全的?

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

  JRE、JDK、JVM 及 JIT 之間有什么不同?

  JRE 代表 Java 運(yùn)行時(shí)(Java run-time),是運(yùn)行 Java 引用所必須的。JDK 代表 Java 開發(fā)工具(Java development kit),是 Java 程序的開發(fā)工具,如 Java 編譯器,它也包含 JRE。JVM 代表 Java 虛擬機(jī)(Java virtual machine),它的責(zé)任是運(yùn)行 Java 應(yīng)用。JIT 代表即時(shí)編譯(Just In Time compilation),當(dāng)代碼執(zhí)行的次數(shù)超過一定的閾值時(shí),會(huì)將 Java 字節(jié)碼轉(zhuǎn)換為本地代碼,如,主要的熱點(diǎn)代碼會(huì)被準(zhǔn)換為本地代碼,這樣有利大幅度提高 Java 應(yīng)用的性能。

Java程序員面試題大全含答案

  解釋 Java 堆空間及 GC?

  當(dāng)通過 Java 命令啟動(dòng) Java 進(jìn)程的時(shí)候,會(huì)為它分配內(nèi)存。內(nèi)存的一部分用于創(chuàng)建堆空間,當(dāng)程序中創(chuàng)建對象的時(shí)候,就從對空間中分配內(nèi)存。GC 是 JVM 內(nèi)部的一個(gè)進(jìn)程,回收無效對象的內(nèi)存用于將來的分配。

Java程序員面試題大全含答案

  你能保證 GC 執(zhí)行嗎?

  不能,雖然你可以調(diào)用 System.gc() 或者 Runtime.gc(),但是沒有辦法保證 GC 的執(zhí)行。

  怎么獲取 Java 程序使用的內(nèi)存?堆使用的百分比?

  可以通過 java.lang.Runtime 類中與內(nèi)存相關(guān)方法來獲取剩余的內(nèi)存,總內(nèi)存及最大堆內(nèi)存。通過這些方法你也可以獲取到堆使用的百分比及堆內(nèi)存的剩余空間。Runtime.freeMemory() 方法返回剩余空間的字節(jié)數(shù),Runtime.totalMemory() 方法總內(nèi)存的字節(jié)數(shù),Runtime.maxMemory() 返回最大內(nèi)存的字節(jié)數(shù)。

  Java 中堆和棧有什么區(qū)別?

  JVM 中堆和棧屬于不同的內(nèi)存區(qū)域,使用目的也不同。棧常用于保存方法幀和局部變量,而對象總是在堆上分配。棧通常都比堆小,也不會(huì)在多個(gè)線程之間共享,而堆被整個(gè) JVM 的所有線程共享。

      以上就是動(dòng)力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java程序員面試題大全含答案”的內(nèi)容,希望對大家有幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。

相關(guān)推薦

最新最全java面試題及答案(初級到高級)

史上最全的中高級JAVA工程師面試題及答案匯總

Java高級開發(fā)工程師面試題

2019史上最全java面試題題庫大全800題

哪有資深java工程師面試題

提交申請后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 丁香在线 | 91午夜精品亚洲一区二区三区 | 日本a在线视频 | 日韩精品视频一区二区三区 | 激情视频亚洲 | 91精品欧美成人 | 五月开心六月伊人色婷婷 | 日韩在线伦理片免费观看 | 国产日韩欧美91 | 国产在播放一区 | 免费一级视频在线播放 | 日日夜人人澡人人澡人人看免 | 成人网18网站 | 91短视频版在线观看www免费 | 一级做a毛片在线看 | 欧美在线a | 中文字幕有码在线 | 亚洲综合网美国十次 | 欧美一级黄色片在线观看 | 免费黄色在线网址 | 成人激情视频网 | 亚洲国产第一区二区香蕉日日 | 黄色欧美在线观看 | 天天曰天天干 | 国产成人综合亚洲 | 国产成人综合视频 | 国产亚洲精品国产第一 | 天天操人人射 | 中国特级黄一级真人毛片 | 小明看片 | 在线日韩欧美 | 久久伊人中文字幕有码 | 九色福利| 中文字幕日韩一区二区三区不 | 欧美一级看片a免费观看 | 99re久久| 永久免费观看午夜视频在线 | 色天天综合 | 国产高清一级片 | 波多野结衣久久国产精品 | 亚洲国产精品日韩在线观看 |