成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

超詳細(xì)的Java面試題總結(jié)(二)之Java基礎(chǔ)知識(shí)篇

wangjuntytl / 1223人閱讀

摘要:超詳細(xì)的面試題總結(jié)一之基本知識(shí)多線程和虛擬機(jī)創(chuàng)建線程有幾種不同的方式你喜歡哪一種為什么繼承類(lèi)實(shí)現(xiàn)接口應(yīng)用程序可以使用框架來(lái)創(chuàng)建線程池實(shí)現(xiàn)接口。死亡線程方法執(zhí)行結(jié)束,或者因異常退出了方法,則該線程結(jié)束生命周期。死亡的線程不可再次復(fù)生。

超詳細(xì)的Java面試題總結(jié)(一)之Java基本知識(shí)

多線程和Java虛擬機(jī) 創(chuàng)建線程有幾種不同的方式?你喜歡哪一種?為什么?

繼承Thread類(lèi)

實(shí)現(xiàn)Runnable接口

應(yīng)用程序可以使用Executor框架來(lái)創(chuàng)建線程池

實(shí)現(xiàn)Callable接口。

我更喜歡實(shí)現(xiàn)Runnable接口這種方法,當(dāng)然這也是現(xiàn)在大多程序員會(huì)選用的方法。因?yàn)橐粋€(gè)類(lèi)只能繼承一個(gè)父類(lèi)而可以實(shí)現(xiàn)多個(gè)接口。同時(shí),線程池也是非常高效的,很容易實(shí)現(xiàn)和使用。

簡(jiǎn)述線程,程序、進(jìn)程的基本概念。以及他們之間關(guān)系是什么?(參考書(shū)籍:《Java程序設(shè)計(jì)基礎(chǔ)》第五版)

線程與進(jìn)程相似,但線程是一個(gè)比進(jìn)程更小的執(zhí)行單位。一個(gè)進(jìn)程在其執(zhí)行的過(guò)程中可以產(chǎn)生多個(gè)線程。與進(jìn)程不同的是同類(lèi)的多個(gè)線程共享同一塊內(nèi)存空間和一組系統(tǒng)資源,所以系統(tǒng)在產(chǎn)生一個(gè)線程,或是在各個(gè)線程之間作切換工作時(shí),負(fù)擔(dān)要比進(jìn)程小得多,也正因?yàn)槿绱?,線程也被稱(chēng)為輕量級(jí)進(jìn)程。

程序是含有指令和數(shù)據(jù)的文件,被存儲(chǔ)在磁盤(pán)或其他的數(shù)據(jù)存儲(chǔ)設(shè)備中,也就是說(shuō)程序是靜態(tài)的代碼。

進(jìn)程是程序的一次執(zhí)行過(guò)程,是系統(tǒng)運(yùn)行程序的基本單位,因此進(jìn)程是動(dòng)態(tài)的。系統(tǒng)運(yùn)行一個(gè)程序即是一個(gè)進(jìn)程從創(chuàng)建,運(yùn)行到消亡的過(guò)程。簡(jiǎn)單來(lái)說(shuō),一個(gè)進(jìn)程就是一個(gè)執(zhí)行中的程序,它在計(jì)算機(jī)中一個(gè)指令接著一個(gè)指令地執(zhí)行著,同時(shí),每個(gè)進(jìn)程還占有某些系統(tǒng)資源如CPU時(shí)間,內(nèi)存空間,文件,文件,輸入輸出設(shè)備的使用權(quán)等等。換句話說(shuō),當(dāng)程序在執(zhí)行時(shí),將會(huì)被操作系統(tǒng)載入內(nèi)存中。
線程是進(jìn)程劃分成的更小的運(yùn)行單位。線程和進(jìn)程最大的不同在于基本上各進(jìn)程是獨(dú)立的,而各線程則不一定,因?yàn)橥贿M(jìn)程中的線程極有可能會(huì)相互影響。從另一角度來(lái)說(shuō),進(jìn)程屬于操作系統(tǒng)的范疇,主要是同一段時(shí)間內(nèi),可以同時(shí)執(zhí)行一個(gè)以上的程序,而線程則是在同一程序內(nèi)幾乎同時(shí)執(zhí)行一個(gè)以上的程序段。

什么是多線程?為什么程序的多線程功能是必要的?

多線程就是幾乎同時(shí)執(zhí)行多個(gè)線程(一個(gè)處理器在某一個(gè)時(shí)間點(diǎn)上永遠(yuǎn)都只能是一個(gè)線程!即使這個(gè)處理器是多核的,除非有多個(gè)處理器才能實(shí)現(xiàn)多個(gè)線程同時(shí)運(yùn)行。)。幾乎同時(shí)是因?yàn)閷?shí)際上多線程程序中的多個(gè)線程實(shí)際上是一個(gè)線程執(zhí)行一會(huì)然后其他的線程再執(zhí)行,并不是很多書(shū)籍所謂的同時(shí)執(zhí)行。這樣可以帶來(lái)以下的好處:

使用線程可以把占據(jù)長(zhǎng)時(shí)間的程序中的任務(wù)放到后臺(tái)去處理

用戶界面可以更加吸引人,這樣比如用戶點(diǎn)擊了一個(gè)按鈕去觸發(fā)某些事件的處理,可以彈出一個(gè)進(jìn)度條來(lái)顯示處理的進(jìn)度

程序的運(yùn)行速度可能加快

在一些等待的任務(wù)實(shí)現(xiàn)上如用戶輸入、文件讀寫(xiě)和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內(nèi)存占用等等。

還有其他很多使用多線程的好處,這里就不一一說(shuō)明了。

多線程與多任務(wù)的差異是什么?(參考書(shū)籍:《Java程序設(shè)計(jì)基礎(chǔ)》第五版)

多任務(wù)與多線程是兩個(gè)不同的概念,
多任務(wù)是針對(duì)操作系統(tǒng)而言的,表示操作系統(tǒng)可以同時(shí)運(yùn)行多個(gè)應(yīng)用程序。
而多線程是針對(duì)一個(gè)進(jìn)程而言的,表示在一個(gè)進(jìn)程內(nèi)部可以幾乎同時(shí)執(zhí)行多個(gè)線程

線程有哪些基本狀態(tài)?這些狀態(tài)是如何定義的?

新建(new):新創(chuàng)建了一個(gè)線程對(duì)象。

可運(yùn)行(runnable):線程對(duì)象創(chuàng)建后,其他線程(比如main線程)調(diào)用了該對(duì)象的start()方法。該狀態(tài)的線程位于可運(yùn)行線程池中,等待被線程調(diào)度選中,獲 取cpu的使用權(quán)。

運(yùn)行(running):可運(yùn)行狀態(tài)(runnable)的線程獲得了cpu時(shí)間片(timeslice),執(zhí)行程序代碼。

阻塞(block):阻塞狀態(tài)是指線程因?yàn)槟撤N原因放棄了cpu使用權(quán),也即讓出了cpu timeslice,暫時(shí)停止運(yùn)行。直到線程進(jìn)入可運(yùn)行(runnable)狀態(tài),才有 機(jī)會(huì)再次獲得cpu timeslice轉(zhuǎn)到運(yùn)行(running)狀態(tài)。阻塞的情況分三種:

(一). 等待阻塞:運(yùn)行(running)的線程執(zhí)行o.wait()方法,JVM會(huì)把該線程放 入等待隊(duì)列(waitting queue)中。
(二). 同步阻塞:運(yùn)行(running)的線程在獲取對(duì)象的同步鎖時(shí),若該同步鎖 被別的線程占用,則JVM會(huì)把該線程放入鎖池(lock pool)中。
(三). 其他阻塞: 運(yùn)行(running)的線程執(zhí)行Thread.sleep(long ms)或t.join()方法,或者發(fā)出了I/O請(qǐng)求時(shí),JVM會(huì)把該線程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時(shí)join()等待線程終止或者超時(shí)、或者I/O處理完畢時(shí),線程重新轉(zhuǎn)入可運(yùn)行(runnable)狀態(tài)。

死亡(dead):線程run()、main()方法執(zhí)行結(jié)束,或者因異常退出了run()方法,則該線程結(jié)束生命周期。死亡的線程不可再次復(fù)生。


備注:
可以用早起坐地鐵來(lái)比喻這個(gè)過(guò)程:
還沒(méi)起床:sleeping
起床收拾好了,隨時(shí)可以坐地鐵出發(fā):Runnable
等地鐵來(lái):Waiting
地鐵來(lái)了,但要排隊(duì)上地鐵:I/O阻塞
上了地鐵,發(fā)現(xiàn)暫時(shí)沒(méi)座位:synchronized阻塞
地鐵上找到座位:Running
到達(dá)目的地:Dead

什么是線程的同步?程序中為什么要實(shí)現(xiàn)線程的同步?是如何實(shí)現(xiàn)同步的?

當(dāng)一個(gè)線程對(duì)共享的數(shù)據(jù)進(jìn)行操作時(shí),應(yīng)使之成為一個(gè)”原子操作“,即在沒(méi)有完成相關(guān)操作之前,不允許其他線程打斷它,否則,就會(huì)破壞數(shù)據(jù)的完整性,必然會(huì)得到錯(cuò)誤的處理結(jié)果,這就是線程的同步。
在多線程應(yīng)用中,考慮不同線程之間的數(shù)據(jù)同步和防止死鎖。當(dāng)兩個(gè)或多個(gè)線程之間同時(shí)等待對(duì)方釋放資源的時(shí)候就會(huì)形成線程之間的死鎖。為了防止死鎖的發(fā)生,需要通過(guò)同步來(lái)實(shí)現(xiàn)線程安全。

在監(jiān)視器(Monitor)內(nèi)部,是如何做線程同步的?程序應(yīng)該做哪種級(jí)別的同步?

在 java 虛擬機(jī)中, 每個(gè)對(duì)象( Object 和 class )通過(guò)某種邏輯關(guān)聯(lián)監(jiān)視器,每個(gè)監(jiān)視器和一個(gè)對(duì)象引用相關(guān)聯(lián), 為了實(shí)現(xiàn)監(jiān)視器的互斥功能, 每個(gè)對(duì)象都關(guān)聯(lián)著一把鎖.
一旦方法或者代碼塊被 synchronized 修飾, 那么這個(gè)部分就放入了監(jiān)視器的監(jiān)視區(qū)域, 確保一次只能有一個(gè)線程執(zhí)行該部分的代碼, 線程在獲取鎖之前不允許執(zhí)行該部分的代碼
另外 java 還提供了顯式監(jiān)視器( Lock )和隱式監(jiān)視器( synchronized )兩種鎖方案

什么是死鎖(deadlock)?

360百科

死鎖 :是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過(guò)程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去 。
產(chǎn)生原因:

因?yàn)橄到y(tǒng)資源不足。

進(jìn)程運(yùn)行推進(jìn)順序不合適。

資源分配不當(dāng)?shù)取?/p>

占用資源的程序崩潰等。

如果系統(tǒng)資源充足,進(jìn)程的資源請(qǐng)求都能夠得到滿足,死鎖出現(xiàn)的可能性就很低,否則就會(huì)因爭(zhēng)奪有限的資源而陷入死鎖。其次,進(jìn)程運(yùn)行推進(jìn)順序與速度不同,也可能產(chǎn)生死鎖。

下面四個(gè)條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要下列條件之一不滿足,就不會(huì)發(fā)生死鎖。

互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。

請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。

不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪。

循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。

死鎖的解除與預(yù)防:

理解了死鎖的原因,尤其是產(chǎn)生死鎖的四個(gè)必要條件,就可以最大可能地避免、預(yù)防和 解除死鎖。所以,在系統(tǒng)設(shè)計(jì)、進(jìn)程調(diào)度等方面注意如何不讓這四個(gè)必要條件成立,如何確 定資源的合理分配算法,避免進(jìn)程永久占據(jù)系統(tǒng)資源。此外,也要防止進(jìn)程在處于等待狀態(tài)的情況下占用資源。因此,對(duì)資源的分配要給予合理的規(guī)劃。

如何確保N個(gè)線程可以訪問(wèn)N個(gè)資源同時(shí)又不導(dǎo)致死鎖?

上面一題我們知道了發(fā)生死鎖的四個(gè)必要條件。我們只要使其中一個(gè)不成立就行了。一種非常簡(jiǎn)單的避免死鎖的方式就是:指定獲取鎖的順序,并強(qiáng)制線程按照指定的順序獲取鎖。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會(huì)出現(xiàn)死鎖了。這也就是破壞了第四個(gè)條件循環(huán)等待條件。

Java中垃圾回收有什么目的?什么時(shí)候進(jìn)行垃圾回收?

垃圾回收是在內(nèi)存中存在沒(méi)有引用的對(duì)象或超過(guò)作用域的對(duì)象時(shí)進(jìn)行。

垃圾回收的目的是識(shí)別并且丟棄應(yīng)用不再使用的對(duì)象來(lái)釋放和重用資源。

finalize()方法什么時(shí)候被調(diào)用?析構(gòu)函數(shù)(finalization)的目的是什么?

1)垃圾回收器(garbage colector)決定回收某對(duì)象時(shí),就會(huì)運(yùn)行該對(duì)象的finalize()方法;
finalize是Object類(lèi)的一個(gè)方法,該方法在Object類(lèi)中的聲明protected void finalize() throws Throwable { }
在垃圾回收器執(zhí)行時(shí)會(huì)調(diào)用被回收對(duì)象的finalize()方法,可以覆蓋此方法來(lái)實(shí)現(xiàn)對(duì)其資源的回收。注意:一旦垃圾回收器準(zhǔn)備釋放對(duì)象占用的內(nèi)存,將首先調(diào)用該對(duì)象的finalize()方法,并且下一次垃圾回收動(dòng)作發(fā)生時(shí),才真正回收對(duì)象占用的內(nèi)存空間

2)GC本來(lái)就是內(nèi)存回收了,應(yīng)用還需要在finalization做什么呢? 答案是大部分時(shí)候,什么都不用做(也就是不需要重載)。只有在某些很特殊的情況下,比如你調(diào)用了一些native的方法(一般是C寫(xiě)的),可以要在finaliztion里去調(diào)用C的釋放函數(shù)。

如果對(duì)象的引用被置為null,垃圾收集器是否會(huì)立即釋放對(duì)象占用的內(nèi)存?

不會(huì),在下一個(gè)垃圾回收周期中,這個(gè)對(duì)象將是可被回收的。

Java中堆和棧的區(qū)別

Java中堆和棧的區(qū)別

堆內(nèi)存用來(lái)存放由new創(chuàng)建的對(duì)象和數(shù)組。 在堆中分配的內(nèi)存,由Java虛擬機(jī)的自動(dòng)垃圾回收器來(lái)管理。
中一般存放的是局部變量(方法中的變量或某代碼段里(比如for循環(huán)))

Java堆的結(jié)構(gòu)是什么樣子的?什么是堆中的永久代(Perm Gen space)?

Java堆的結(jié)構(gòu)是什么樣子的?什么是堆中的永久代

Java集合框架

基本知識(shí)點(diǎn)總結(jié):

思維導(dǎo)圖源文件百度云:
密碼:8w8r

思維導(dǎo)圖軟件百度云盤(pán)地址:
密碼:e8k7
集合框架精髓

源碼分析:

注意:Java8的HashMap對(duì)之前做了較大的優(yōu)化,其中最重要的一個(gè)優(yōu)化就是桶中的元素不再唯一按照鏈表組合,也可以使用紅黑樹(shù)進(jìn)行存儲(chǔ),總之,目標(biāo)只有一個(gè),那就是在安全和功能性完備的情況下讓其速度更快,提升性能。

[透過(guò)源碼學(xué)習(xí)集合框架之ArrayList - CSDN博客
含System.arraycopy()和Arrays.copyOf()方法解析
](https://juejin.im/post/5a0d74...

JDK1.8HashMap源碼分析

HashMap源碼分析

Java學(xué)習(xí)筆記之LinkedList基本用法((這位兄弟的文章寫(xiě)的還不錯(cuò)))

歡迎關(guān)注我的微信公眾號(hào):“Java面試通關(guān)手冊(cè)”(分享各種Java學(xué)習(xí)資源,面試題,以及企業(yè)級(jí)Java實(shí)戰(zhàn)項(xiàng)目回復(fù)關(guān)鍵字免費(fèi)領(lǐng)?。?/strong>

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68882.html

相關(guān)文章

  • 一份送給Java初學(xué)者指南

    摘要:編程思想第版這本書(shū)要常讀,初學(xué)者可以快速概覽,中等程序員可以深入看看,老鳥(niǎo)還可以用之回顧的體系。以下視頻整理自慕課網(wǎng)工程師路徑相關(guān)免費(fèi)課程。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識(shí)點(diǎn)以及面試問(wèn)題,目前已經(jīng)開(kāi)源,會(huì)一直完善下去,歡迎建議和指導(dǎo)歡迎Star: https://github.com/Snailclimb/Java-Guide 筆者建議初學(xué)者學(xué)習(xí)Java的方式:看書(shū)+視頻+實(shí)踐(初...

    banana_pi 評(píng)論0 收藏0
  • 詳細(xì)Java面試總結(jié)(四 )JavaWeb基礎(chǔ)知識(shí)總結(jié)

    摘要:系列文章請(qǐng)查看超詳細(xì)的面試題總結(jié)一之基礎(chǔ)知識(shí)篇超詳細(xì)的面試題總結(jié)二之基礎(chǔ)知識(shí)篇超詳細(xì)的面試題總結(jié)三之集合篇常見(jiàn)問(wèn)題下面的都是自己之前在學(xué)習(xí)的時(shí)候總結(jié)的,對(duì)于鞏固的基礎(chǔ)知識(shí)應(yīng)該有很大幫助。注意多線程的并發(fā)的讀寫(xiě)類(lèi)屬性會(huì)導(dǎo)致數(shù)據(jù)不同步。 系列文章請(qǐng)查看: 超詳細(xì)的Java面試題總結(jié)(一)之Java基礎(chǔ)知識(shí)篇 超詳細(xì)的Java面試題總結(jié)(二)之Java基礎(chǔ)知識(shí)篇 超詳細(xì)的Java面試題總結(jié)(...

    Leo_chen 評(píng)論0 收藏0
  • 詳細(xì)Java面試總結(jié)(一)Java基礎(chǔ)知識(shí)

    摘要:最近在備戰(zhàn)面試的過(guò)程中,整理一下面試題。成員變量如果沒(méi)有被賦初值,則會(huì)自動(dòng)以類(lèi)型的默認(rèn)值而賦值一種情況例外被修飾但沒(méi)有被修飾的成員變量必須顯示地賦值而局部變量則不會(huì)自動(dòng)賦值。   最近在備戰(zhàn)面試的過(guò)程中,整理一下面試題。大多數(shù)題目都是自己手敲的,網(wǎng)上也有很多這樣的總結(jié)。自己感覺(jué)總是很亂,所以花了很久把自己覺(jué)得重要的東西總結(jié)了一下。 面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別 面向過(guò)程:  優(yōu)點(diǎn):性能比面...

    vpants 評(píng)論0 收藏0
  • Java開(kāi)發(fā)

    摘要:大多數(shù)待遇豐厚的開(kāi)發(fā)職位都要求開(kāi)發(fā)者精通多線程技術(shù)并且有豐富的程序開(kāi)發(fā)調(diào)試優(yōu)化經(jīng)驗(yàn),所以線程相關(guān)的問(wèn)題在面試中經(jīng)常會(huì)被提到。將對(duì)象編碼為字節(jié)流稱(chēng)之為序列化,反之將字節(jié)流重建成對(duì)象稱(chēng)之為反序列化。 JVM 內(nèi)存溢出實(shí)例 - 實(shí)戰(zhàn) JVM(二) 介紹 JVM 內(nèi)存溢出產(chǎn)生情況分析 Java - 注解詳解 詳細(xì)介紹 Java 注解的使用,有利于學(xué)習(xí)編譯時(shí)注解 Java 程序員快速上手 Kot...

    LuDongWei 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<