摘要:超詳細(xì)的面試題總結(jié)一之基本知識多線程和虛擬機創(chuàng)建線程有幾種不同的方式你喜歡哪一種為什么繼承類實現(xiàn)接口應(yīng)用程序可以使用框架來創(chuàng)建線程池實現(xiàn)接口。死亡線程方法執(zhí)行結(jié)束,或者因異常退出了方法,則該線程結(jié)束生命周期。死亡的線程不可再次復(fù)生。
超詳細(xì)的Java面試題總結(jié)(一)之Java基本知識
多線程和Java虛擬機 創(chuàng)建線程有幾種不同的方式?你喜歡哪一種?為什么?繼承Thread類
實現(xiàn)Runnable接口
應(yīng)用程序可以使用Executor框架來創(chuàng)建線程池
實現(xiàn)Callable接口。
我更喜歡實現(xiàn)Runnable接口這種方法,當(dāng)然這也是現(xiàn)在大多程序員會選用的方法。因為一個類只能繼承一個父類而可以實現(xiàn)多個接口。同時,線程池也是非常高效的,很容易實現(xiàn)和使用。
簡述線程,程序、進(jìn)程的基本概念。以及他們之間關(guān)系是什么?(參考書籍:《Java程序設(shè)計基礎(chǔ)》第五版)線程與進(jìn)程相似,但線程是一個比進(jìn)程更小的執(zhí)行單位。一個進(jìn)程在其執(zhí)行的過程中可以產(chǎn)生多個線程。與進(jìn)程不同的是同類的多個線程共享同一塊內(nèi)存空間和一組系統(tǒng)資源,所以系統(tǒng)在產(chǎn)生一個線程,或是在各個線程之間作切換工作時,負(fù)擔(dān)要比進(jìn)程小得多,也正因為如此,線程也被稱為輕量級進(jìn)程。
程序是含有指令和數(shù)據(jù)的文件,被存儲在磁盤或其他的數(shù)據(jù)存儲設(shè)備中,也就是說程序是靜態(tài)的代碼。
進(jìn)程是程序的一次執(zhí)行過程,是系統(tǒng)運行程序的基本單位,因此進(jìn)程是動態(tài)的。系統(tǒng)運行一個程序即是一個進(jìn)程從創(chuàng)建,運行到消亡的過程。簡單來說,一個進(jìn)程就是一個執(zhí)行中的程序,它在計算機中一個指令接著一個指令地執(zhí)行著,同時,每個進(jìn)程還占有某些系統(tǒng)資源如CPU時間,內(nèi)存空間,文件,文件,輸入輸出設(shè)備的使用權(quán)等等。換句話說,當(dāng)程序在執(zhí)行時,將會被操作系統(tǒng)載入內(nèi)存中。
線程是進(jìn)程劃分成的更小的運行單位。線程和進(jìn)程最大的不同在于基本上各進(jìn)程是獨立的,而各線程則不一定,因為同一進(jìn)程中的線程極有可能會相互影響。從另一角度來說,進(jìn)程屬于操作系統(tǒng)的范疇,主要是同一段時間內(nèi),可以同時執(zhí)行一個以上的程序,而線程則是在同一程序內(nèi)幾乎同時執(zhí)行一個以上的程序段。
多線程就是幾乎同時執(zhí)行多個線程(一個處理器在某一個時間點上永遠(yuǎn)都只能是一個線程!即使這個處理器是多核的,除非有多個處理器才能實現(xiàn)多個線程同時運行。)。幾乎同時是因為實際上多線程程序中的多個線程實際上是一個線程執(zhí)行一會然后其他的線程再執(zhí)行,并不是很多書籍所謂的同時執(zhí)行。這樣可以帶來以下的好處:
使用線程可以把占據(jù)長時間的程序中的任務(wù)放到后臺去處理
用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發(fā)某些事件的處理,可以彈出一個進(jìn)度條來顯示處理的進(jìn)度
程序的運行速度可能加快
在一些等待的任務(wù)實現(xiàn)上如用戶輸入、文件讀寫和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內(nèi)存占用等等。
還有其他很多使用多線程的好處,這里就不一一說明了。
多線程與多任務(wù)的差異是什么?(參考書籍:《Java程序設(shè)計基礎(chǔ)》第五版)多任務(wù)與多線程是兩個不同的概念,
多任務(wù)是針對操作系統(tǒng)而言的,表示操作系統(tǒng)可以同時運行多個應(yīng)用程序。
而多線程是針對一個進(jìn)程而言的,表示在一個進(jìn)程內(nèi)部可以幾乎同時執(zhí)行多個線程
新建(new):新創(chuàng)建了一個線程對象。
可運行(runnable):線程對象創(chuàng)建后,其他線程(比如main線程)調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運行線程池中,等待被線程調(diào)度選中,獲 取cpu的使用權(quán)。
運行(running):可運行狀態(tài)(runnable)的線程獲得了cpu時間片(timeslice),執(zhí)行程序代碼。
阻塞(block):阻塞狀態(tài)是指線程因為某種原因放棄了cpu使用權(quán),也即讓出了cpu timeslice,暫時停止運行。直到線程進(jìn)入可運行(runnable)狀態(tài),才有 機會再次獲得cpu timeslice轉(zhuǎn)到運行(running)狀態(tài)。阻塞的情況分三種:
(一). 等待阻塞:運行(running)的線程執(zhí)行o.wait()方法,JVM會把該線程放 入等待隊列(waitting queue)中。
(二). 同步阻塞:運行(running)的線程在獲取對象的同步鎖時,若該同步鎖 被別的線程占用,則JVM會把該線程放入鎖池(lock pool)中。
(三). 其他阻塞: 運行(running)的線程執(zhí)行Thread.sleep(long ms)或t.join()方法,或者發(fā)出了I/O請求時,JVM會把該線程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)入可運行(runnable)狀態(tài)。
死亡(dead):線程run()、main()方法執(zhí)行結(jié)束,或者因異常退出了run()方法,則該線程結(jié)束生命周期。死亡的線程不可再次復(fù)生。
備注:
可以用早起坐地鐵來比喻這個過程:
還沒起床:sleeping
起床收拾好了,隨時可以坐地鐵出發(fā):Runnable
等地鐵來:Waiting
地鐵來了,但要排隊上地鐵:I/O阻塞
上了地鐵,發(fā)現(xiàn)暫時沒座位:synchronized阻塞
地鐵上找到座位:Running
到達(dá)目的地:Dead
當(dāng)一個線程對共享的數(shù)據(jù)進(jìn)行操作時,應(yīng)使之成為一個”原子操作“,即在沒有完成相關(guān)操作之前,不允許其他線程打斷它,否則,就會破壞數(shù)據(jù)的完整性,必然會得到錯誤的處理結(jié)果,這就是線程的同步。
在多線程應(yīng)用中,考慮不同線程之間的數(shù)據(jù)同步和防止死鎖。當(dāng)兩個或多個線程之間同時等待對方釋放資源的時候就會形成線程之間的死鎖。為了防止死鎖的發(fā)生,需要通過同步來實現(xiàn)線程安全。
在 java 虛擬機中, 每個對象( Object 和 class )通過某種邏輯關(guān)聯(lián)監(jiān)視器,每個監(jiān)視器和一個對象引用相關(guān)聯(lián), 為了實現(xiàn)監(jiān)視器的互斥功能, 每個對象都關(guān)聯(lián)著一把鎖.
一旦方法或者代碼塊被 synchronized 修飾, 那么這個部分就放入了監(jiān)視器的監(jiān)視區(qū)域, 確保一次只能有一個線程執(zhí)行該部分的代碼, 線程在獲取鎖之前不允許執(zhí)行該部分的代碼
另外 java 還提供了顯式監(jiān)視器( Lock )和隱式監(jiān)視器( synchronized )兩種鎖方案
360百科
死鎖 :是指兩個或兩個以上的進(jìn)程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去 。
產(chǎn)生原因:
因為系統(tǒng)資源不足。
進(jìn)程運行推進(jìn)順序不合適。
資源分配不當(dāng)?shù)取?/p>
占用資源的程序崩潰等。
如果系統(tǒng)資源充足,進(jìn)程的資源請求都能夠得到滿足,死鎖出現(xiàn)的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,進(jìn)程運行推進(jìn)順序與速度不同,也可能產(chǎn)生死鎖。
下面四個條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要下列條件之一不滿足,就不會發(fā)生死鎖。
互斥條件:一個資源每次只能被一個進(jìn)程使用。
請求與保持條件:一個進(jìn)程因請求資源而阻塞時,對已獲得的資源保持不放。
不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強行剝奪。
循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。
死鎖的解除與預(yù)防:
理解了死鎖的原因,尤其是產(chǎn)生死鎖的四個必要條件,就可以最大可能地避免、預(yù)防和 解除死鎖。所以,在系統(tǒng)設(shè)計、進(jìn)程調(diào)度等方面注意如何不讓這四個必要條件成立,如何確 定資源的合理分配算法,避免進(jìn)程永久占據(jù)系統(tǒng)資源。此外,也要防止進(jìn)程在處于等待狀態(tài)的情況下占用資源。因此,對資源的分配要給予合理的規(guī)劃。
如何確保N個線程可以訪問N個資源同時又不導(dǎo)致死鎖?上面一題我們知道了發(fā)生死鎖的四個必要條件。我們只要使其中一個不成立就行了。一種非常簡單的避免死鎖的方式就是:指定獲取鎖的順序,并強制線程按照指定的順序獲取鎖。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會出現(xiàn)死鎖了。這也就是破壞了第四個條件循環(huán)等待條件。
Java中垃圾回收有什么目的?什么時候進(jìn)行垃圾回收?垃圾回收是在內(nèi)存中存在沒有引用的對象或超過作用域的對象時進(jìn)行。
垃圾回收的目的是識別并且丟棄應(yīng)用不再使用的對象來釋放和重用資源。
finalize()方法什么時候被調(diào)用?析構(gòu)函數(shù)(finalization)的目的是什么?1)垃圾回收器(garbage colector)決定回收某對象時,就會運行該對象的finalize()方法;
finalize是Object類的一個方法,該方法在Object類中的聲明protected void finalize() throws Throwable { }
在垃圾回收器執(zhí)行時會調(diào)用被回收對象的finalize()方法,可以覆蓋此方法來實現(xiàn)對其資源的回收。注意:一旦垃圾回收器準(zhǔn)備釋放對象占用的內(nèi)存,將首先調(diào)用該對象的finalize()方法,并且下一次垃圾回收動作發(fā)生時,才真正回收對象占用的內(nèi)存空間
2)GC本來就是內(nèi)存回收了,應(yīng)用還需要在finalization做什么呢? 答案是大部分時候,什么都不用做(也就是不需要重載)。只有在某些很特殊的情況下,比如你調(diào)用了一些native的方法(一般是C寫的),可以要在finaliztion里去調(diào)用C的釋放函數(shù)。
如果對象的引用被置為null,垃圾收集器是否會立即釋放對象占用的內(nèi)存?不會,在下一個垃圾回收周期中,這個對象將是可被回收的。
Java中堆和棧的區(qū)別Java中堆和棧的區(qū)別
堆內(nèi)存用來存放由new創(chuàng)建的對象和數(shù)組。 在堆中分配的內(nèi)存,由Java虛擬機的自動垃圾回收器來管理。
棧中一般存放的是局部變量(方法中的變量或某代碼段里(比如for循環(huán)))
Java堆的結(jié)構(gòu)是什么樣子的?什么是堆中的永久代
Java集合框架基本知識點總結(jié):
思維導(dǎo)圖源文件百度云:
密碼:8w8r
思維導(dǎo)圖軟件百度云盤地址:
密碼:e8k7
集合框架精髓
源碼分析:
注意:Java8的HashMap對之前做了較大的優(yōu)化,其中最重要的一個優(yōu)化就是桶中的元素不再唯一按照鏈表組合,也可以使用紅黑樹進(jìn)行存儲,總之,目標(biāo)只有一個,那就是在安全和功能性完備的情況下讓其速度更快,提升性能。
[透過源碼學(xué)習(xí)集合框架之ArrayList - CSDN博客
含System.arraycopy()和Arrays.copyOf()方法解析
](https://juejin.im/post/5a0d74...
JDK1.8HashMap源碼分析
HashMap源碼分析
Java學(xué)習(xí)筆記之LinkedList基本用法((這位兄弟的文章寫的還不錯))
歡迎關(guān)注我的微信公眾號:“Java面試通關(guān)手冊”(分享各種Java學(xué)習(xí)資源,面試題,以及企業(yè)級Java實戰(zhàn)項目回復(fù)關(guān)鍵字免費領(lǐng)?。?/strong>
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/68882.html
摘要:編程思想第版這本書要常讀,初學(xué)者可以快速概覽,中等程序員可以深入看看,老鳥還可以用之回顧的體系。以下視頻整理自慕課網(wǎng)工程師路徑相關(guān)免費課程。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識點以及面試問題,目前已經(jīng)開源,會一直完善下去,歡迎建議和指導(dǎo)歡迎Star: https://github.com/Snailclimb/Java-Guide 筆者建議初學(xué)者學(xué)習(xí)Java的方式:看書+視頻+實踐(初...
摘要:系列文章請查看超詳細(xì)的面試題總結(jié)一之基礎(chǔ)知識篇超詳細(xì)的面試題總結(jié)二之基礎(chǔ)知識篇超詳細(xì)的面試題總結(jié)三之集合篇常見問題下面的都是自己之前在學(xué)習(xí)的時候總結(jié)的,對于鞏固的基礎(chǔ)知識應(yīng)該有很大幫助。注意多線程的并發(fā)的讀寫類屬性會導(dǎo)致數(shù)據(jù)不同步。 系列文章請查看: 超詳細(xì)的Java面試題總結(jié)(一)之Java基礎(chǔ)知識篇 超詳細(xì)的Java面試題總結(jié)(二)之Java基礎(chǔ)知識篇 超詳細(xì)的Java面試題總結(jié)(...
摘要:最近在備戰(zhàn)面試的過程中,整理一下面試題。成員變量如果沒有被賦初值,則會自動以類型的默認(rèn)值而賦值一種情況例外被修飾但沒有被修飾的成員變量必須顯示地賦值而局部變量則不會自動賦值。 最近在備戰(zhàn)面試的過程中,整理一下面試題。大多數(shù)題目都是自己手敲的,網(wǎng)上也有很多這樣的總結(jié)。自己感覺總是很亂,所以花了很久把自己覺得重要的東西總結(jié)了一下。 面向?qū)ο蠛兔嫦蜻^程的區(qū)別 面向過程: 優(yōu)點:性能比面...
摘要:大多數(shù)待遇豐厚的開發(fā)職位都要求開發(fā)者精通多線程技術(shù)并且有豐富的程序開發(fā)調(diào)試優(yōu)化經(jīng)驗,所以線程相關(guān)的問題在面試中經(jīng)常會被提到。將對象編碼為字節(jié)流稱之為序列化,反之將字節(jié)流重建成對象稱之為反序列化。 JVM 內(nèi)存溢出實例 - 實戰(zhàn) JVM(二) 介紹 JVM 內(nèi)存溢出產(chǎn)生情況分析 Java - 注解詳解 詳細(xì)介紹 Java 注解的使用,有利于學(xué)習(xí)編譯時注解 Java 程序員快速上手 Kot...
閱讀 658·2021-11-23 09:51
閱讀 3258·2021-10-11 10:58
閱讀 15407·2021-09-29 09:47
閱讀 3529·2021-09-01 11:42
閱讀 1281·2019-08-29 16:43
閱讀 1832·2019-08-29 15:37
閱讀 2089·2019-08-29 12:56
閱讀 1718·2019-08-28 18:21