|
|
![]() |
![]() |
尚學堂首頁—新聞公告—常見問題 |
西安尚學堂Java線程相關筆試面試題目 |
www.zyopwk.live 發布人:java | 來自:本站 | 發布時間:2019-07-29 09:06:00 | 點擊次數:1615 |
![]() |
1.死鎖的產生的一些特定條件
互斥條件:進程對于所分配到的資源具有排它性,即一個資源只能被一個進程占用,直到被該進程釋放 。
請求和保持條件:一個進程因請求被占用資源而發生阻塞時,對已獲得的資源保持不放。 不剝奪條件:任何一個資源在沒被該進程釋放之前,任何其他進程都無法對他剝奪占用。 循環等待條件:當發生死鎖時,所等待的進程必定會形成一個環路(類似于死循環),造成永久阻塞。 2. 如何避免? 加鎖順序: 當多個線程需要相同的一些鎖,但是按照不同的順序加鎖,死鎖就很容易發生。如果能確保所有的線程都是按照相同的順序獲得鎖,那么死鎖就不會發生。 當然這種方式需要你事先知道所有可能會用到的鎖,然而總有些時候是無法預知的。 加鎖時限: 加上一個超時時間,若一個線程沒有在給定的時限內成功獲得所有需要的鎖,則會進行回退并釋放所有已經獲得的鎖,然后等待一段隨機的時間再重試。 但是如果有非常多的線程同一時間去競爭同一批資源,就算有超時和回退機制,還是可能會導致這些線程重復地嘗試但卻始終得不到鎖。 死鎖檢測: 死鎖檢測即每當一個線程獲得了鎖,會在線程和鎖相關的數據結構中(map、graph等等)將其記下。除此之外,每當有線程請求鎖,也需要記錄在這個數據結構中。 死鎖檢測是一個更好的死鎖預防機制,它主要是針對那些不可能實現按序加鎖并且鎖超時也不可行的場景。 3. 類在虛擬機中的加載過程
加載Loading: 通過一個類的全限定名來獲取一個二進制字節流、將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構、在內存中生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口。 驗證Verification: 確保Class文件的字節流中包含的信息符合當前虛擬機的要求,并不會危害虛擬機的自身安全。 準備Preparation: 正式為類變量分配內存并設置類變量初始值。 解析Resolution: 虛擬機將常量池內的符號引用替換為直接引用的過程。 初始化Initialization: 類加載過程的最后一步,到了這個階段才真正開始執行類中定義的Java程序代碼。 使用Using: 根據你寫的程序代碼定義的行為執行。 卸載Unloading: GC負責卸載,這部分一般不用討論。
4.強引用、軟引用、弱引用、虛引用與GC的關系
強引用:new出的對象之類的引用,只要強引用還在,永遠不會回收。 軟引用:引用但非必須的對象,內存溢出異常之前回收。 弱引用:非必須的對象,對象只能生存到下一次垃圾收集發生之前。 虛引用:對生存時間無影響,在垃圾回收時得到通知。
5.概括的解釋下線程的幾種狀態 就緒(Runnable):線程準備運行,不一定立馬就能開始執行。 運行中(Running):進程正在執行線程的代碼。 等待中(Waiting):線程處于阻塞的狀態,等待外部的處理結束。 睡眠中(Sleeping):線程被強制睡眠。 I/O阻塞(Blocked on I/O):等待I/O操作完成。 同步阻塞(Blocked on Synchronization):等待獲取鎖。 死亡(Dead):線程完成了執行。
6. Java集合類里面基本的接口有哪些 Collection:代表一組對象,每一個對象都是它的子元素。 Set:不包含重復元素的Collection。 List:有順序的collection,并且可以包含重復元素。 Map:可以把鍵(key)映射到值(value)的對象,鍵不能重復。
7.notify和notifyAll區別 他們的作用都是通知處于等待該對象的線程。 1、notifyAll使所有原來在該對象上等待被notify的線程統統退出wait的狀態,變成等待該對象上的鎖,一旦該對象被解鎖,他們就會去競爭。 2、notify是通知其中一個線程,不會通知所有的線程。
8.內部類和靜態內部類的區別 內部類: 內部類中的變量和方法不能聲明為靜態的。 內部類實例化:B是A的內部類,實例化B:A.B b = new A().new B()。 內部類可以引用外部類的靜態或者非靜態屬性及方法。 靜態內部類: 靜態內部類屬性和方法可以聲明為靜態的或者非靜態的。 實例化靜態內部類:B是A的靜態內部類,A.B b = new A.B()。 靜態內部類只能引用外部類的靜態的屬性及方法。 inner classes——內部類 static nested classes——靜態嵌套類 其實人家不叫靜態內部類,只是叫習慣了,從字面就很容易理解了。 內部類依靠外部類的存在為前提,而靜態嵌套類則可以完全獨立,明白了這點就很好理解了。
9.非靜態內部類中的變量和方法不能聲明為靜態的原因 靜態類型的屬性和方法,在類加載的時候就會存在于內存中。使用某個類的靜態屬性和方法,那么這個類必須要加載到虛擬機中。但是非靜態內部類并不隨外部類一起加載,只有在實例化外部類之后才會加載。 我們設想一個場景:在外部類并沒有實例化,內部類還沒有加載的時候如果調用內部類的靜態成員或方法,內部類還沒有加載,卻試圖在內存中創建該內部類的靜態成員,就會產生沖突。所以非靜態內部類不能有靜態成員變量或靜態方法。
10.Enumeration和Iterator的區別
java中的集合類都提供了返回Iterator的方法,就是迭代器,它和Enumeration(枚舉)的主要區別其實就是Iterator可以刪除元素,但是Enumration卻不能。 使用Iterator來遍歷集合時,應使用Iterator的remove()方法來刪除集合中的元素,使用集合的remove()方法將拋出ConcurrentModificationException異常。 Enumeration接口的功能和Iterator接口的功能是重復的。此外,Iterator 接口添加了一個可選的移除操作,并使用較短的方法名。新的實現應該優先考慮使用Iterator接口而不是Enumeration接口。 Enumeration速度是Iterator的2倍,同時占用更少的內存。但是,Iterator遠遠比Enumeration安全,因為其他線程不能夠修改正在被iterator遍歷的集合里面的對象。 |
|
官方微信
手機站