題總結(jié))
1.回答輸出結(jié)果為什么Integer i new Integer(100); Integer j new Integer(100); System.out.println(i j); String a abc; String b a b c; System.out.println(a b); String c abcd; String d a d; System.out.println(c d);1.ij 輸出false原因i和j對(duì)象雖然在常量池范圍內(nèi)但都通過(guò)new關(guān)鍵字分配新內(nèi)存地址。2.ab輸出true原因都是字符串常量都直接在字符串常量池中直接引用。3.cd輸出false原因d是在堆內(nèi)創(chuàng)建新字符串對(duì)象。2.String b在JVM中具體是怎么創(chuàng)建的在棧中創(chuàng)建一個(gè)b變量在字符串常量池招是否存在“abc“若找到了則直接引用沒(méi)有找到在字符串常量池中創(chuàng)建。3.JVM中運(yùn)行時(shí)數(shù)據(jù)區(qū)都包含那些部分分為線程私有和線程共享線程私有程序計(jì)數(shù)器本地方法棧虛擬機(jī)棧。線程共享元空間堆4.堆是干嘛的方法區(qū)是干嘛的虛擬機(jī)棧是干嘛的堆是用來(lái)存創(chuàng)建的對(duì)象數(shù)組等方法區(qū)存儲(chǔ)字節(jié)碼指令類的結(jié)構(gòu)信息靜態(tài)變量常量JIT編譯器編譯的目標(biāo)對(duì)象識(shí)別的機(jī)器碼。虛擬機(jī)棧存入一個(gè)個(gè)棧幀一層層方法每個(gè)棧幀保存了每個(gè)方法的局部變量操作數(shù)棧和動(dòng)態(tài)鏈接方法出口等信息。5.講講堆分為那些部分每個(gè)部分都是啥堆分為新生代和老年代新生代約占1/3分為survive0和survive1和Eden區(qū)老年代約占2/3.6.講講垃圾收集新生代中對(duì)于Eden區(qū)域中的對(duì)象生命周期短所以垃圾收集頻率高速率塊未回收的進(jìn)入到survive0中而在老年代中對(duì)象占用空間大生命周期長(zhǎng)回收頻率低速率慢。7.一個(gè)對(duì)象是怎么從新生代流轉(zhuǎn)到老年代的新生代對(duì)象經(jīng)過(guò)頻繁的垃圾收集還存活達(dá)到閾值時(shí)會(huì)流轉(zhuǎn)到老年代當(dāng)新生代容量不夠時(shí)survive0,survive1中的對(duì)象會(huì)直接流轉(zhuǎn)為老年代對(duì)象。8.surviveo區(qū)域、survive1區(qū)域具體講講新生代中經(jīng)歷垃圾回收存活的對(duì)象的年齡加1并放入到surivie0中如果達(dá)到閾值則流轉(zhuǎn)為老年代對(duì)象。survive1和survive0中總有一個(gè)為空。9.Java線程有那些狀態(tài)各個(gè)狀態(tài)是怎么流轉(zhuǎn)的當(dāng)線程新創(chuàng)建時(shí)未執(zhí)行start()方法時(shí)處于New狀態(tài)當(dāng)線程準(zhǔn)備執(zhí)行或正在執(zhí)行時(shí)處于RANNABLE狀態(tài)執(zhí)行join時(shí)間值wait時(shí)間值等方法時(shí)間處于計(jì)時(shí)等待狀態(tài)等待時(shí)間結(jié)束處于RANABLE狀態(tài)執(zhí)行joinwait方法時(shí)處于等待狀態(tài)需要通過(guò)notifynotifyall等方法喚醒如果存在鎖競(jìng)爭(zhēng)鎖失敗的線程處于阻塞狀態(tài)執(zhí)行ran()方法完畢進(jìn)入終止?fàn)顟B(tài)。10.如果執(zhí)行sleep方法會(huì)進(jìn)入什么狀態(tài)線程會(huì)進(jìn)入計(jì)時(shí)等待狀態(tài)休眠狀態(tài)如果有鎖并不會(huì)釋放鎖一直持有鎖。11.線程同步機(jī)制了解嗎了解過(guò)線程并發(fā)進(jìn)行線程采用搶占模式為了使操作的資源正確通過(guò)同步鎖Synchronize保證線程的同步安全也可以使用CAS和ReentrantLock保證線程同步安全。12.Lock有哪些實(shí)現(xiàn)有ReentrantLockReentrantLockReadWriteLock等實(shí)現(xiàn)類都是保證線程同步安全的13.Synchronize和ReentrantLock有什么區(qū)別分別在什么情況下使用Synchronize是一個(gè)關(guān)鍵字聲明在方法上或在代碼塊中使用是隱式獲取鎖和釋放鎖用法簡(jiǎn)單不能中斷不能判斷狀態(tài)不能設(shè)置超時(shí)僅支持非公平鎖底層是通過(guò)Monitor監(jiān)視器、而ReentrantLock是Lock類的實(shí)現(xiàn)類需要通過(guò)創(chuàng)建對(duì)象通過(guò)對(duì)象調(diào)用獲取鎖和釋放鎖的方法也可以trylock()非阻塞的方式顯式獲取和釋放鎖unlock()必須配合findlly 代碼塊使用用法復(fù)雜可以通過(guò)lockInterruptibly()中斷通過(guò)trylock時(shí)間值設(shè)置超時(shí)時(shí)間支持公平鎖和非公平鎖底層是通過(guò)AQS實(shí)現(xiàn)的。14.講講Synchronize鎖升級(jí)鎖升級(jí)是從無(wú)鎖-偏向鎖-輕量級(jí)鎖-重量級(jí)鎖偏向鎖是只有一個(gè)線程頻繁的獲取釋放鎖會(huì)記住這個(gè)線程不用通過(guò)鎖直接比較實(shí)現(xiàn)如果過(guò)發(fā)現(xiàn)不同的線程會(huì)升級(jí)為輕量級(jí)鎖線程競(jìng)爭(zhēng)不激烈沖突小線程通過(guò)CAS的方式獲取鎖如果CAS長(zhǎng)時(shí)間自旋說(shuō)明沖突激烈鎖會(huì)升級(jí)為重量級(jí)鎖具有強(qiáng)烈的互斥性和排他性已獨(dú)占的方式獲取鎖。15.講講CAS的原理會(huì)遇到什么問(wèn)題怎么解決CAS是一種無(wú)鎖化的并發(fā)管理操作執(zhí)行流程是先獲取內(nèi)存中需要修改的值A(chǔ)通過(guò)計(jì)算得出B再將自己拿到的值A(chǔ)與內(nèi)存中的值C比較如果相同則進(jìn)行更新操作如果不同則進(jìn)行重試或自旋操作。會(huì)出現(xiàn)ABA問(wèn)題是CAS拿到內(nèi)存中的值A(chǔ)10但是存在另一個(gè)線程修改內(nèi)存中的值為10當(dāng)前線程比較時(shí)內(nèi)存中的值與自己的值相同邊進(jìn)行更新沒(méi)有發(fā)現(xiàn)其他修改的線程可以通過(guò)加一個(gè)版本號(hào)解決。16.線程安全的集合類有哪些1.CopyOnWriteArrayList,使用ReentrantLock保證線程安全。2.CopyOnWriteArraySet內(nèi)部是一個(gè)CopyOnWriteArrayList,所以使用ReentrantLock保證線程安全。3.ArrayBlockingQueue使用一個(gè)鎖ReentrantLock保證線程安全4.LinkedBlockingQueue使用兩個(gè)鎖對(duì)象ReentrantLock保證線程安全。5.ConcurrentHashMap使用CASsynchronize保證線程安全在沒(méi)有發(fā)生哈希沖突時(shí)使用CAS寫入發(fā)生發(fā)哈希沖突使用鏈表頭節(jié)點(diǎn)或紅黑樹的根節(jié)點(diǎn)作為鎖對(duì)象進(jìn)行局部上鎖。6.Stack使用Synchronize保證線程安全。17.如果我想要一個(gè)線程安全的List應(yīng)該怎么做可以使用CopyOnWriteArrayList適合讀多寫少的場(chǎng)景18.線程池了解嘛有哪些核心參數(shù)執(zhí)行流程是什么線程池是一種池化技術(shù)實(shí)現(xiàn)了線程復(fù)用線程的并發(fā)管理避免了線程的重復(fù)創(chuàng)建。參數(shù)核心線程數(shù)最大線程數(shù)非核心線程的空閑時(shí)間的時(shí)間單位阻塞工作隊(duì)列線程工廠拒絕策略。執(zhí)行流程當(dāng)線程任務(wù)進(jìn)入線程池判斷小于核心線程數(shù)則創(chuàng)建核心線程執(zhí)行該線程任務(wù)若大于核心線程數(shù)小于工作隊(duì)列則線程任務(wù)入隊(duì)等待若大于工作隊(duì)列小于最大線程數(shù)創(chuàng)建非核心線程執(zhí)行線程任務(wù)若大于最大線程數(shù)執(zhí)行拒絕策略。19.內(nèi)存有限快速找到top10000怎么辦使用優(yōu)先隊(duì)列小頂堆棧先遍歷1000個(gè)數(shù)據(jù)通過(guò)for循環(huán)入隊(duì)剩余元素入隊(duì)元素隊(duì)頭元素對(duì)頭元素出隊(duì)遍歷至數(shù)據(jù)結(jié)束得到top1000020. 數(shù)據(jù)量極大找到一個(gè)數(shù)在其中是否存在怎么做使用布隆過(guò)濾器穿件創(chuàng)建布隆過(guò)濾器對(duì)象把數(shù)據(jù)存入到布隆過(guò)濾器中來(lái)判斷某個(gè)數(shù)字是否存在21.布隆過(guò)濾器的原理優(yōu)缺點(diǎn)將數(shù)據(jù)通過(guò)不同的哈希法計(jì)算出不同的哈希值并在位數(shù)組中將計(jì)算出來(lái)的哈希值位置上的0改為1.優(yōu)點(diǎn)可以高效率查詢和插入數(shù)據(jù)占用內(nèi)存極小缺點(diǎn)存在誤判存入的數(shù)據(jù)不能取出原數(shù)據(jù)原生布隆過(guò)濾器不支持刪除。22. 如果讓你實(shí)現(xiàn)布隆過(guò)濾器的hash算法怎么寫使用不同的種子seed和容量cap和傳如數(shù)據(jù)datahash seed*cao-1data.hashcode^data.hashcode()16