面試準備android(二)

我真是個懶孩子,不過總算又整理了一波,現在算是對操作系統的基本知識有一定的瞭解了,繼續加油,下一批的是操作系統和tcp/ip的,畢竟網絡協議之類的總在筆試看到(>人<;),任重而道遠!!
--------------我是萌萌噠的分割線-------------
21.實現多線程的兩種方法:Thread與Runable。
繼承Thread類。:1,定義類繼承Thread。2,複寫Thread類中的run方法。目的:將自定義代碼存儲在run方法。讓線程運行。//run();僅僅是對象調用方法。而線程創建了,並沒有運行。
3,調用線程的start方法,
實現Runable接口:1,定義類實現Runnable接口(實現的好處:避免了單繼承的侷限性。)2,覆蓋Runnable接口中的run方法。將線程要運行的代碼存放在該run方法中。3,通過Thread類建立線程對象。4,將Runnable接口的子類對象作爲實際參數傳遞給Thread類的構造函數。5,調用Thread類的start方法開啓線程並調用Runnable接口子類的run方法。
實現Runnable接口相對於繼承Thread類來說,有如下的顯著優勢:
1.適合多個相同代碼的線程去處理同一個資源的情況
2.可以避免由於java的單繼承特性帶來的侷限
3.增強了程序的健壯性,代碼能夠被多個線程共享,代碼與數據時獨立的
22.線程同步的方法:synchronized、lock、reentrantLock等。
synchronized: 在資源競爭不是很激烈的情況下,偶爾會有同步的情形下,synchronized是很合適的。原因在於,編譯程序通常會儘可能的進行優化synchronize,另外可讀性非常好

ReentrantLock:提供了多樣化的同步,比如有時間限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。在資源競爭不激烈的情形下,性能稍微比synchronized差點點。但是當同步非常激烈的時候,synchronized的性能一下子能下降好幾十倍。而ReentrantLock確還能維持常態。

Atomic: 和上面的類似,不激烈情況下,性能比synchronized略遜,而激烈的時候,也能維持常態。激烈的時候,Atomic的性能會優於ReentrantLock一倍左右。但是其有一個缺點,就是隻能同步一個值,一段代碼中只能出現一個Atomic的變量,多於一個同步無效。因爲他不能在多個Atomic之間同步。

synchronized是在JVM層面上實現的,不但可以通過一些監控工具監控synchronized的鎖定,而且在代碼執行時出現異常,JVM會自動釋放鎖定,但是使用Lock則不行,lock是通過代碼實現的,要保證鎖定一定會被釋放,就必須將unLock()放到finally{}中
所以,我們寫同步的時候,優先考慮synchronized,如果有特殊需要,再進一步優化。ReentrantLock和Atomic如果用的不好,不僅不能提高性能,還可能帶來災難。
23.鎖的等級:對象鎖、類鎖
對象鎖
當一個對象中有synchronized method或synchronized block的時候調用此對象的同步方法或進入其同步區域時,就必須先獲得對象鎖。如果此對象的對象鎖已被其他調用者佔用,則需要等待此鎖被釋放
由於一個class不論被實例化多少次,其中的靜態方法和靜態變量在內存中都只由一份。

注意,如果這個類有兩個實例,比如:ClassA a = new ClassA();ClassA b = new ClassA();那麼如果你在a這對象上調用了methodA,不會影響b這個對象,也就是說對於b這個對象,他也可以調用methodA,因爲這是兩對象,所以說對象鎖是針對對象的

類鎖
其實系統中並不存在什麼類鎖。當一個同步靜態方法被調用時,系統獲取的其實就是代表該類的類對象的對象鎖
同時獲取類鎖和對象鎖是允許的,並不會產生任何問題,但使用類鎖時一定要注意,一旦產生類鎖的嵌套獲取的話,就會產生死鎖,因爲每個class在內存中都只能生成一個Class實例對象。
死鎖,是指多個進程循環等待它方佔有的資源而無限期地僵持下去的局面。(銀行家算法,讀者寫者問題)

死鎖問題需要滿足以下條件:
1. 互斥條件:一個資源每次只能被一個線程使用。
2. 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
3. 不剝奪條件:進程已獲得的資源,在未使用完之前,不能強行剝奪。
4. 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。
只要破壞死鎖 4 個必要條件之一中的任何一個,死鎖問題就能被解決。
http://blog.csdn.net/abigale1011/article/details/6450845避免死鎖的方法,和打破上面條件的代價

24 寫出生產者消費者模式 (多線程同步。
同步問題的解決方法一般是採用信號或者加鎖機制,即生產者線程當緩衝區已滿時放棄自己的執行權,進入等待狀態,並通知消費者線程執行。消費者線程當緩衝區已空時放棄自己的執行權,進入等待狀態,並通知生產者線程執行。這樣一來就保持了線程的同步,並避免了線程間互相等待而進入死鎖狀態)

25.ThreadLocal的設計理念與作用:http://itfish.net/article/22032.html
ThreadLocal的作用就是將線程經常要用到的對象放到屬於線程自己的內存空間裏,在該線程的執行過程中,可以通過靜態的ThreadLocal實例來方便的存取這個對象,而不用再通過參數的形式來回傳遞。

26.ThreadPool用法與優勢。(線性池的使用:http://www.infoq.com/cn/articles/java-threadPool
好處:
第一:降低資源消耗。通過重複利用已創建的線程降低線程創建和銷燬造成的消耗。
第二:提高響應速度。當任務到達時,任務可以不需要等到線程創建就能立即執行。
第三:提高線程的可管理性。線程是稀缺資源,如果無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一的分配,調優和監控。

27.Concurrent包裏的其他東西:ArrayBlockingQueue、CountDownLatch等等
http://blog.csdn.net/windsunmoon/article/details/36903901 (太多了,不用看)

28.wait()和sleep()的區別
wait(),調用一般形式 對象名.wait(),通常需要放入方法synchronize修飾的語句塊或方法中。作用是把當前對象放入對象的等待集合中。
sleep是線程被調用時,佔着cpu去睡覺,其他線程不能佔用cpu,os認爲該線程正在工作,不會讓出系統資源。

29.foreach與正常for循環效率對比
foreach和while的效率幾乎是差不多的,而for則相對較慢一些。
foreach的內部原理其實還是 Iterator,但它不能像Iterator一樣可以人爲的控制,而且也不能調用iterator.remove();更不能使用下標來方便的訪問元素.foreach這種循環一般只適合做數組的遍歷,提取數據顯示等,不適合用於增加刪除和使用下標等複雜的操作.

30、Java IO與NIO
面向流與面向緩衝
Java NIO和IO之間第一個最大的區別是,IO是面向流的,NIO是面向緩衝區的。 Java IO面向流意味着每次從流中讀一個或多個字節,直至讀取所有字節,它們沒有被緩存在任何地方。此外,它不能前後移動流中的數據。如果需要前後移動從流中讀取的數據,需要先將它緩存到一個緩衝區。 Java NIO的緩衝導向方法略有不同。數據讀取到一個它稍後處理的緩衝區,需要時可在緩衝區中前後移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩衝區中包含所有您需要處理的數據。而且,需確保當更多的數據讀入緩衝區時,不要覆蓋緩衝區裏尚未處理的數據。
阻塞與非阻塞IO
Java IO的各種流是阻塞的。這意味着,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些數據被讀取,或數據完全寫入。該線程在此期間不能再幹任何事情了。 Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什麼都不會獲取。而不是保持線程阻塞,所以直至數據變的可以讀取之前,該線程可以繼續做其他的事情。 非阻塞寫也是如此。一個線程請求寫入一些數據到某通道,但不需要等待它完全寫入,這個線程同時可以去做別的事情。 線程通常將非阻塞IO的空閒時間用於在其它通道上執行IO操作,所以一個單獨的線程現在可以管理多個輸入和輸出通道(channel)。
選擇器(Selectors)
Java NIO的選擇器允許一個單獨的線程來監視多個輸入通道,你可以註冊多個通道使用一個選擇器,然後使用一個單獨的線程來“選擇”通道:這些通道里已經有可以處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。

31.反射的作用與原理。
java語言在運行時擁有一項自觀的能力,反射使您的程序代碼能夠得到裝載到JVM中的類的內部信息,允許您執行程序時纔得到需要類的內部信息,而不是在編寫代碼的時候就必須要知道所需類的內部信息,這使反射成爲構建靈活的應用的主要工具。

反射的常用類和函數:Java反射機制的實現要藉助於4個類:Class,Constructor,Field,Method;其中class代表的是類對象,Constructor-類的構造器對象,Field-類的屬性對象,Method-類的方法對象,通過這四個對象我們可以粗略的看到一個類的各個組成部分。其中最核心的就是Class類,它是實現反射的基礎

Java反射機制提供了一種動態鏈接程序組件的多功能方法,它允許程序創建和控制任何類的對象(根據安全性限制)之前,無需提前硬編碼目標類。這些特性使得反射特別適用於創建以非常普通的方式與對象協作的庫。

32.泛型常用特點,List能否轉爲List。(不能)

通過傳遞不同類型的類型變量給泛型可以產生不同的JAVA類型。就是說List< String>和List< Object>的類型是不同的。儘管String是java.lang.Object。但是傳遞一個List< String>給一個參數是List< Object>的函數會參數會產生編譯錯誤(compile error)。函數能用 ? 通配符使其接受任何類型的參數。List< ?> 意味着任何類型的對象。 (java泛型http://ludaojuan21.iteye.com/blog/247049

33.解析XML的幾種方式的原理與特點:DOM、SAX、PULL(360筆試有)
34.Java與C++對比。 http://xinklabi.iteye.com/blog/657334
35.Java1.7與1.8新特性。
36. 設計模式:單例、工廠、適配器、責任鏈、觀察者等等。(請看書《設計模式之禪》)
----------基礎java閱讀書籍(走過路過不要錯過)--------

推薦書籍:《java核心技術卷I》《Thinking in java》《java併發編程》《effictive java》《大話設計模式》

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