Java面試題5

來源:互聯網
上載者:User

標籤:https   java線程   使用   建立   合并   虛擬機器   JD   ESS   安全執行緒   

Volatile的特徵:

A、禁止指令重排(有例外) 
B、可見度

Volatile的記憶體語義:

當寫一個volatile變數時,JMM會把線程對應的本地記憶體中的共用變數值重新整理到主記憶體。

當讀一個volatile變數時,JMM會把線程對應的本地記憶體置為無效,線程接下來將從主記憶體中讀取共用變數。

Volatile的重排序

1、當第二個操作為volatile寫操做時,不管第一個操作是什麼(普通讀寫或者volatile讀寫),都不能進行重排序。這個規則確保volatile寫之前的所有操作都不會被重排序到volatile之後;

2、當第一個操作為volatile讀操作時,不管第二個操作是什麼,都不能進行重排序。這個規則確保volatile讀之後的所有操作都不會被重排序到volatile之前;

3、當第一個操作是volatile寫操作時,第二個操作是volatile讀操作,不能進行重排序。

這個規則和前面兩個規則一起構成了:兩個volatile變數操作不能夠進行重排序;

除以上三種情況以外可以進行重排序。

比如:

1、第一個操作是普通變數讀/寫,第二個是volatile變數的讀; 
2、第一個操作是volatile變數的寫,第二個是普通變數的讀/寫;

記憶體屏障/記憶體柵欄

記憶體屏障(Memory Barrier,或有時叫做記憶體柵欄,Memory Fence)是一種CPU指令,用於控制特定條件下的重排序和記憶體可見度問題。Java編譯器也會根據記憶體屏障的規則禁止重排序。(也就是讓一個CPU處理單元中的記憶體狀態對其它處理單元可見的一項技術。)

記憶體屏障可以被分為以下幾種類型:

LoadLoad屏障:對於這樣的語句Load1; LoadLoad; Load2,在Load2及後續讀取操作要讀取的資料被訪問前,保證Load1要讀取的資料被讀取完畢。

StoreStore屏障:對於這樣的語句Store1; StoreStore; Store2,在Store2及後續寫入操作執行前,保證Store1的寫入操作對其它處理器可見。

LoadStore屏障:對於這樣的語句Load1; LoadStore; Store2,在Store2及後續寫入操作被刷出前,保證Load1要讀取的資料被讀取完畢。

StoreLoad屏障:對於這樣的語句Store1; StoreLoad; Load2,在Load2及後續所有讀取操作執行前,保證Store1的寫入對所有處理器可見。它的開銷是四種屏障中最大的。

在大多數處理器的實現中,這個屏障是個萬能屏障,兼具其它三種記憶體屏障的功能。

記憶體屏障阻礙了CPU採用最佳化技術來降低記憶體操作延遲,必須考慮因此帶來的效能損失。為了達到最佳效能,最好是把要解決的問題模組化,這樣處理器可以按單元執行任務,然後在任務單元的邊界放上所有需要的記憶體屏障。採用這個方法可以讓處理器不受限的執行一個任務單元。合理的記憶體屏障組合還有一個好處是:緩衝區在第一次被刷後開銷會減少,因為再填充改緩衝區不需要額外工作了。

happens-before原則

Java是如何?跨平台的?

跨平台是怎樣實現的呢?這就要談及Java虛擬機器(Java Virtual Machine,簡稱 JVM)。

JVM也是一個軟體,不同的平台有不同的版本。我們編寫的Java源碼,編譯後會產生一種 .class 檔案,稱為位元組碼檔案。Java虛擬機器就是負責將位元組碼檔案翻譯成特定平台下的機器碼然後運行。也就是說,只要在不同平台上安裝對應的JVM,就可以運行位元組碼檔案,運行我們編寫的Java程式。

而這個過程中,我們編寫的Java程式沒有做任何改變,僅僅是通過JVM這一”中介層“,就能在不同平台上運行,真正實現了”一次編譯,到處運行“的目的。

JVM是一個”橋樑“,是一個”中介軟體“,是實現跨平台的關鍵,Java代碼首先被編譯成位元組碼檔案,再由JVM將位元組碼檔案翻譯成機器語言,從而達到運行Java程式的目的。

注意:編譯的結果不是產生機器碼,而是產生位元組碼,位元組碼不能直接運行,必須通過JVM翻譯成機器碼才能運行。不同平台下編譯產生的位元組碼是一樣的,但是由JVM翻譯成的機器碼卻不一樣。

所以,運行Java程式必須有JVM的支援,因為編譯的結果不是機器碼,必須要經過JVM的再次翻譯才能執行。即使你將Java程式打包成可執行檔(例如 .exe),仍然需要JVM的支援。

注意:跨平台的是Java程式,不是JVM。JVM是用C/C++開發的,是編譯後的機器碼,不能跨平台,不同平台下需要安裝不同版本的JVM。

手機掃二維碼登入是怎麼實現的?

參考:http://www.jianshu.com/p/7f072ac61763

Java 線程有哪些狀態,這些狀態之間是如何轉化的?

  1. 建立(new):新建立了一個線程對象。

  2. 可運行(runnable):線程對象建立後,其他線程(比如main線程)調用了該對象的start()方法。該狀態的線程位於可運行線程池中,等待被線程調度選中,擷取cpu 的使用權 。

  3. 運行(running):可運行狀態(runnable)的線程獲得了cpu 時間片(timeslice) ,執行程式代碼。

  4. 阻塞(block):阻塞狀態是指線程因為某種原因放棄了cpu 使用權,也即讓出了cpu timeslice,暫時停止運行。直到線程進入可運行(runnable)狀態,才有機會再次獲得cpu timeslice 轉到運行(running)狀態。阻塞的情況分三種:

(一). 等待阻塞:運行(running)的線程執行o.wait()方法,JVM會把該線程放入等待隊列(waitting queue)中。

(二). 同步阻塞:運行(running)的線程在擷取對象的同步鎖時,若該同步鎖被別的線程佔用,則JVM會把該線程放入鎖池(lock pool)中。

(三). 其他阻塞:運行(running)的線程執行Thread.sleep(long ms)或t.join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態逾時、join()等待線程終止或者逾時、或者I/O處理完畢時,線程重新轉入可運行(runnable)狀態。

  1. 死亡(dead):線程run()、main() 方法執行結束,或者因異常退出了run()方法,則該線程結束生命週期。死亡的線程不可再次複生。

List介面、Set介面和Map介面的區別

參考:http://blog.csdn.net/zcg_java/article/details/43232251

Cookie和Session的區別?

參考:http://blog.csdn.net/axin66ok/article/details/6175522

Java中的equals和hashCode方法詳解

參考:http://www.cnblogs.com/Qian123/p/5703507.html

Java中CAS演算法

參考:

http://www.kancloud.cn/seaboat/java-concurrent/117870

TimSort原理

參考:http://suo.im/532OHc

comparable與comparator的區別?

參考:http://www.cnblogs.com/szlbm/p/5504634.html

手寫單例模式(安全執行緒)

參考:http://www.cnblogs.com/hupp/p/4487521.html

Java線程間的通訊方式?

參考1:

http://www.cnblogs.com/mengdd/archive/2013/02/20/2917956.html

參考2:http://www.jb51.net/article/84213.htm

Java8的記憶體分代改進

參考:http://blog.csdn.net/chlu113/article/details/51890469

對Java記憶體模型的理解以及其在並發當中的作用?

參考:http://www.cnblogs.com/_popc/p/6096517.html

Arrays和Collections 對於sort的不同實現原理?

1、Arrays.sort() 
該演算法是一個經過調優的快速排序,此演算法在很多資料集上提供N*log(N)的效能,這導致其他快速排序會降低二次型效能。

2、Collections.sort() 
該演算法是一個經過修改的合并排序演算法(其中,如果低子列表中的最高元素效益高子列表中的最低元素,則忽略合并)。此演算法可提供保證的N*log(N)的效能,此實現將指定列錶轉儲到一個數組中,然後再對數組進行排序,在重設數組中相應位置處每個元素的列表上進行迭代。

Java中object常用方法

1、clone() 
2、equals() 
3、finalize() 
4、getclass() 
5、hashcode() 
6、notify() 
7、notifyAll() 
8、toString()

對於Java中多態的理解

所謂多態就是指程式中定義的引用變數所指向的具體類型和通過該引用變數發出的方法調用在編程時並不確定,而是在程式運行期間才確定,即一個引用變數到底會指向哪個類的執行個體對象,該引用變數發出的方法調用到底是哪個類中實現的方法,必須在由程式運行期間才能決定。

因為在程式運行時才確定具體的類,這樣,不用修改來源程式代碼,就可以讓引用變數綁定到各種不同的類實現上,從而導致該引用調用的具體方法隨之改變,即不修改程式碼就可以改變程式運行時所綁定的具體代碼,讓程式可以選擇多個運行狀態,這就是多態性。

多態的定義:指允許不同類的對象對同一訊息做出響應。即同一訊息可以根據發送對象的不同而採用多種不同的行為方式。(發送訊息就是函數調用)

Java實現多態有三個必要條件:繼承、重寫、父類引用指向子類對象。

繼承:在多態中必須存在有繼承關係的子類和父類。

重寫:子類對父類中某些方法進行重新定義,在調用這些方法時就會調用子類的方法。

父類引用指向子類對象:在多態中需要將子類的引用賦給父類對象,只有這樣該引用才能夠具備技能調用父類的方法和子類的方法。

實現多態的技術稱為:動態綁定(dynamic binding),是指在執行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。

多態的作用:消除類型之間的耦合關係。

Session機制?

參考 :http://justsee.iteye.com/blog/1570652

Java序列化與還原序列化是什嗎?為什麼需要序列化與還原序列化?如何?Java序列化與還原序列化?

參考 :

 http://blog.csdn.net/wangloveall/article/details/7992448/

Spring AOP 實現原理?

參考 :

http://blog.csdn.net/moreevan/article/details/11977115/

Servlet 工作原理?

參考:

http://www.ibm.com/developerworks/cn/java/j-lo-servlet/

Java NIO和IO的區別?

參考:http://www.jb51.net/article/50621.htm

Java中堆記憶體和棧記憶體區別?

參考:

http://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html

反射講一講,主要是概念,都在哪需要反射機制,反射的效能,如何最佳化?

反射機制的定義:

是在運行狀態中,對於任意的一個類,都能夠知道這個類的所有屬性和方法,對任意一個對象都能夠通過反射機制調用一個類的任意方法,這種動態擷取類資訊及動態調用類對象方法的功能稱為java的反射機制。

反射的作用:

1、動態地建立類的執行個體,將類綁定到現有的對象中,或從現有的對象中擷取類型。

2、應用程式需要在運行時從某個特定的程式集中載入一個特定的類。

如何保證RESTful API安全性 ?

參考:

http://blog.csdn.net/ywk253100/article/details/25654101

如何預防Mysql注入?

參考:http://www.jb51.net/article/87948.htm

 

  • 入行IT為什麼建議選擇Java?

  • 2018年學Java能賺多少錢?

  • 怎樣成為優秀的Java程式員?

  • 學Java怎樣可以進BAT?

 

怎能讓這些成為你高薪路上的絆腳石,達妹來幫你!高薪近在咫尺,但他不會自己跑到你的卡裡,你也要伸手行動才能拿到哦~

Java面試題5

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.