Java面試大全(2020年版)31-40

31.當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?

分幾種情況
1).其他方法前是否加了synchronized關鍵字,如果沒加,則能。
2).如果這個方法內部調用了wait,則可以進入其他synchronized方法。
3).如果其他個方法都加了synchronized關鍵字,並且內部沒有調用wait,則不能。
4).如果其他方法是static,它用的同步鎖是當前類的字節碼,與非靜態的方法不能同步,因爲非靜態的方法用的是this。

32.線程的基本概念、線程的基本狀態以及狀態之間的關係

①一個程序中可以有多條執行線索同時執行,一個線程就是程序中的一條執行線索,每個線程上都關聯有要執行的代碼,即可以有多段程序代碼同時運行,每個程序至少都有一個線程,即main方法執行的那個線程。(如果只是一個cpu,它怎麼能夠同時執行多段程序呢?這是從宏觀上來看的,cpu一會執行a線索,一會執行b線索,切換時間很快,給人的感覺是a,b在同時執行,好比大家在同一個辦公室上網,只有一條鏈接到外部網線,其實,這條網線一會爲a傳數據,一會爲b傳數據,由於切換時間很短暫,所以,大家感覺都在同時上網。)
②線程基本狀態:就緒,運行,synchronize阻塞,wait和sleep掛起,結束。wait必須在synchronized內部調用。調用線程的start方法後線程進入就緒狀態,線程調度系統將就緒狀態的線程轉爲運行狀態,遇到synchronized語句時,由運行狀態轉爲阻塞,當synchronized獲得鎖後,由阻塞轉爲運行,在這種情況可以調用wait方法轉爲掛起狀態,當線程關聯的代碼執行完後,線程變爲結束狀態。

33.簡述synchronized和java.util.concurrent.locks.Lock的異同?

主要相同點:Lock能完成synchronized所實現的所有功能
主要不同點:Lock有比synchronized更精確的線程語義和更好的性能。synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,並且必須在finally從句中釋放。Lock還有更強大的功能,例如,它的tryLock方法可以非阻塞方式去拿鎖。

34.java中有幾種類型的流?

字符流和字節流。字節流繼承inputStream和OutputStream,字符流繼承自InputSteamReader和OutputStreamWriter。

35.談談Java IO裏面的常見類,字節流,字符流、接口、實現類、方法阻塞

輸入流就是從外部文件輸入到內存,輸出流主要是從內存輸出到文件。
IO流主要分爲字符流和字節流。
①字符流中有抽象類InputStream和OutputStream,它們的子類FileInputStream,FileOutputStream,BufferedOutputStream等。
②字符流BufferedReader和Writer等。都實現了Closeable, Flushable,
③Appendable這些接口。程序中的輸入輸出都是以流的形式保存的,流中保存的實際上全都是字節文件。
④java中的阻塞式方法是指在程序調用改方法時,必須等待輸入數據可用或者檢測到輸入結束或者拋出異常,否則程序會一直停留在該語句上,不會執行下面的語句。比如read()和readLine()方法。

36.字符流和字節流有什麼區別?

字符流以字符或者字符數組的形式讀寫數據,只能讀寫二進制文件;字節流能讀寫各種類型的數據。
字節流與字符流的不同是他們的處理方式,字節流是最基本的,採用ASCII編碼。
但是實際上很多數據是文本,所以提出字符流的概念,採用unicode編碼
兩者之間通過inputStreamReader與outputStreamWriter來關聯,實際上是通過byte[]與String來關聯
字節流輸出: 程序–>字節流–>文件
字符流輸出:程序–>字符流–>緩衝–>文件
程序中所有的數據都是以流的方式進行傳輸與保存的
在關閉字符流後會強制性的將緩衝區的數據輸出,若沒有關閉緩衝區的內容是無法輸出的,
如果想不關閉並且還想輸出緩衝區的內容,用writer類的flush()方法來完成,

37.講講NIO

看了一些文章,傳統的IO流是阻塞式的,會一直監聽一個ServerSocket,在調用read等方法時,他會一直等到數據到來或者緩衝區已滿時才返回。調用accept也是一直阻塞到有客戶端連接纔會返回。每個客戶端連接過來後,服務端都會啓動一個線程去處理該客戶端的請求。並且多線程處理多個連接。每個線程擁有自己的棧空間並且佔用一些 CPU 時間。每個線程遇到外部未準備好的時候,都會阻塞掉。阻塞的結果就是會帶來大量的進程上下文切換。
對於NIO,它是非阻塞式,核心類:
1.Buffer爲所有的原始類型提供 (Buffer)緩存支持。
2.Charset字符集編碼解碼解決方案
3.Channel一個新的原始I/O抽象,用於讀寫Buffer類型,通道可以認爲是一種連接,可以是到特定設備,程序或者是網絡的連接。

38.BufferedReader屬於哪種流,它主要是用來做什麼的,它裏面有那些經典的方法

屬於處理流中的緩衝流,可以將讀取的內容存在內存裏面,有readLine()方法

39.什麼是節點流,什麼是處理流,它們各有什麼用處,處理流的創建有什麼特徵

節點流直接與數據源相連,用於輸入或者輸出處理流:在節點流的基礎上對之進行加工,進行一些功能的擴展處理流的構造器必須要 傳入節點流的子類

40.如果我要對字節流進行大量的從硬盤讀取,要用那個流,爲什麼

BufferedInputStream使用緩衝流能夠減少對硬盤的損傷

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章