- 相關(guān)推薦
java面試官常問(wèn)的問(wèn)題
http://emrowgh.com中多線程同步是什么?
在多線程程序下,同步能控制對(duì)共享資源的訪問(wèn)。如果沒(méi)有同步,當(dāng)一個(gè) Java 線程在修改一個(gè)共享變量時(shí),另外一個(gè)線程正在使用或者更新同一個(gè)變量,這樣容易導(dǎo)致程序出現(xiàn)錯(cuò)誤的結(jié)果。
2.Sleep ()、suspend ()和 wait ()之間有什么區(qū)別?
http://emrowgh.com()使當(dāng)前線程在指定的時(shí)間處于“非運(yùn)行”(Not Runnable)狀態(tài)。線程一直持有對(duì)象的監(jiān)視器。比如一個(gè)線程當(dāng)前在一個(gè)同步塊或同步方法中,其它線程不能進(jìn)入該塊或方法中。如果另一線程調(diào)用了 interrupt ()方法,它將喚醒那個(gè)“睡眠的”線程。
注意:sleep ()是一個(gè)靜態(tài)方法。這意味著只對(duì)當(dāng)前線程有效,一個(gè)常見(jiàn)的錯(cuò)誤是調(diào)用http://emrowgh.com(),(這里的t是一個(gè)不同于當(dāng)前線程的線程)。即便是執(zhí)行http://emrowgh.com(),也是當(dāng)前線程進(jìn)入睡眠,而不是t線程。http://emrowgh.com()是過(guò)時(shí)的方法,使用 suspend ()導(dǎo)致線程進(jìn)入停滯狀態(tài),該線程會(huì)一直持有對(duì)象的監(jiān)視器,suspend ()容易引起死鎖問(wèn)題。
http://emrowgh.com()使當(dāng)前線程出于“不可運(yùn)行”狀態(tài),和 sleep ()不同的是 wait 是 object 的方法而不是 thread。
Sleep() s調(diào)用 http://emrowgh.com()時(shí),線程先要獲取這個(gè)對(duì)象的對(duì)象鎖,當(dāng)前線程必須在鎖對(duì)象保持同步,把當(dāng)前線程添加到等待隊(duì)列中,隨后另一線程可以同步同一個(gè)對(duì)象鎖來(lái)調(diào)用 http://emrowgh.com(),這樣將喚醒原來(lái)等待中的線程,然后釋放該鎖;旧 wait ()/notify ()與 sleep ()/interrupt ()類(lèi)似,只是前者需要獲取對(duì)象鎖。
3. Java三大特性:多態(tài) 、繼承和封裝
http://emrowgh.com和 == 的區(qū)別?
參考《Head First Java》
使用==來(lái)比較兩個(gè)primitive主數(shù)據(jù)類(lèi)型,或者判斷兩個(gè)引用是否引用同一個(gè)對(duì)象。
使用equals()來(lái)判斷兩個(gè)對(duì)象是否在意義上相等。(像是兩個(gè)String對(duì)象是否帶有相同的字節(jié)組合)
==: 如果涉及的是比較基本數(shù)據(jù)類(lèi)型的話,==用來(lái)比較基本數(shù)據(jù)類(lèi)型的值的大小(也就是其中的字節(jié)組合)
例:
inta = 3;byteb = 3;if (a== b) {//返回的是true}
如果涉及的是引用,那么==用來(lái)判斷引用的是否是同一個(gè)對(duì)象:
例:
Car a =newCar();Car b=newCar();Car c = a;if (a== b) {//返回false}if (a == c) {//返回true}if (b == c) {//返回false}
5.代碼塊各自的鎖
6.父類(lèi)與子類(lèi)里的構(gòu)造方法
http://emrowgh.com,map,list的區(qū)別與用法
8.同步在不同位置加同步標(biāo)記(synchronized)有什么區(qū)別? 同步標(biāo)記加到靜態(tài)方法(靜態(tài)方法同步)
9.設(shè)計(jì)模式,懶漢模式,工廠模式
10.堆和棧的比較
http://emrowgh.com
11. arraylist 用數(shù)組來(lái)實(shí)現(xiàn)一個(gè)
1http://emrowgh.com和linklist有什么區(qū)別
arraylist:
呈線性鏈狀,結(jié)構(gòu)類(lèi)似數(shù)組。
如果只是修改刪除頭或者尾部的元素的話,使用arraylist比較好
linklist:
如果想要在鏈表中插入元素,使用linklist最合適。
13.for和foreach的區(qū)別
for:
for each:
14. 進(jìn)程和線程的區(qū)別
15.線程和線程非安全的概念
16.volatile int a = 0; 內(nèi)存同步
17.ArrayList,HashMap等集合框架類(lèi),重要基礎(chǔ)類(lèi)String的處理。HashMap的底層存儲(chǔ)結(jié)構(gòu)等。順帶考察:對(duì)接口,繼承,重載重寫(xiě)的基本理解;以及異常處理的注意事項(xiàng)
18.多線程問(wèn)題:
(1)線程安全問(wèn)題。HashMap是否安全,為何不安全。ConcurrentHashMap,線程安全,為何安全。底層是如何實(shí)現(xiàn)的。
(2)http://emrowgh.com下的常見(jiàn)類(lèi)的使用,ThreadPool的深入考察;BlockingQueue的使用。(take,poll的區(qū)別,put,offer的區(qū)別);原子類(lèi)的實(shí)現(xiàn)。
(3)各種常見(jiàn)鎖的使用
(17,18均為某位大神羅列,我就偷個(gè)懶在這挪用一下,請(qǐng)見(jiàn)諒)
19.什么是死鎖
死鎖就是兩個(gè)或兩個(gè)以上的線程被無(wú)限的阻塞,線程之間相互等待所需資源。這種情況可能發(fā)生在當(dāng)兩個(gè)線程嘗試獲取其它資源的鎖,而每個(gè)線程又陷入無(wú)限等待其它資源鎖的釋放,除非一個(gè)用戶進(jìn)程被終止。就 JavaAPI 而言,線程死鎖可能發(fā)生在一下情況。
當(dāng)兩個(gè)線程相互調(diào)用 http://emrowgh.com()
當(dāng)兩個(gè)線程使用嵌套的同步塊,一個(gè)線程占用了另外一個(gè)線程必需的鎖,互相等待時(shí)被阻塞就有可能出現(xiàn)死鎖。
20.什么是線程餓死,什么是活鎖?
http://emrowgh.com是最基本的數(shù)據(jù)類(lèi)型嗎?
基本數(shù)據(jù)類(lèi)型(primitive data type):
Byte(8bit),short(16bit),char(16bit),int(32bit),long(64bit),float(32bit),double(64bit),Boolean(true/false);
String 不是基本數(shù)據(jù)類(lèi)型,http://emrowgh.com類(lèi)是final類(lèi)型的,因此不可以繼承這個(gè)類(lèi)、不能修改這個(gè)類(lèi)。為了提高效率節(jié)省空間,我們應(yīng)該用StringBuffer類(lèi)
http://emrowgh.com和StringBuilder的區(qū)別?
StringBuffer和StringBuilder有相似的功能,但是StringBuffer是synchronized(同步)。 (The StringBuffer class is similar to StringBuffer except that methods for modifying buffer in StringBuffer are synchronized. Use StringBuffer if it may be accessed by multiple tasks http://emrowgh.com