一:基礎(chǔ)類
?1.hashmap的基本原理逞度,內(nèi)部數(shù)據(jù)結(jié)構(gòu),put操作的整體流程漱抓,是否線程安全以及為什么?jdk8對hashmap做了哪些優(yōu)化扒接?
? ? 答:HashMap是基于哈希表的Map接口的非同步實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作袍啡,并允許使用null值和null鍵踩官。此類不保證映射的順序,特別是它不保證該順序恒久不變境输,HashMap實(shí)際上是一個(gè)“鏈表散列”的數(shù)據(jù)結(jié)構(gòu)蔗牡,即數(shù)組和鏈表的結(jié)合體。我們往HashMap中put元素的時(shí)候嗅剖,先根據(jù)key的hashCode重新計(jì)算hash值辩越,根據(jù)hash值得到這個(gè)元素在數(shù)組中的位置(即下標(biāo)),如果數(shù)組該位置上已經(jīng)存放有其他元素了窗悯,那么在這個(gè)位置上的元素將以鏈表的形式存放区匣,新加入的放在鏈頭,最先加入的放在鏈尾蒋院。如果數(shù)組該位置上沒有元素亏钩,就直接將該元素放到此數(shù)組中的該位置上。對HashMap的操作不是線程安全的欺旧,通過觀察源碼發(fā)現(xiàn)姑丑,當(dāng)多個(gè)線程在某一個(gè)時(shí)刻同時(shí)對HashMap做結(jié)構(gòu)性的修改,我們可以看到整個(gè)方法實(shí)現(xiàn)中沒有任何的同步機(jī)制辞友,那么存在一個(gè)線程獲取或者修改數(shù)據(jù)結(jié)構(gòu)時(shí)栅哀,存在另外一個(gè)線程獲取了一個(gè)錯(cuò)誤的結(jié)果。jdk8對hashMap的數(shù)據(jù)結(jié)構(gòu)的改變有個(gè)調(diào)整称龙,當(dāng)數(shù)組達(dá)到一定的閾值時(shí)留拾,bucket就會由鏈表轉(zhuǎn)換為紅黑樹的方式進(jìn)行存儲,而不是進(jìn)行table的擴(kuò)容鲫尊。
2.String類為什么是不可變的痴柔?StringBuilder和StringBuffer的區(qū)別,字符串常量池疫向,StringBuffer為什么是線程安全咳蔚?加號的底層原理?
答:首先String類是用final關(guān)鍵字修飾搔驼,這說明String不可繼承谈火,String類的成員字段value是個(gè)char[]數(shù)組,而且是用final修飾的舌涨。final修飾的字段創(chuàng)建以后就不可改變糯耍。不可變的好處:1.1.參考java字符串池的設(shè)計(jì)模式。比如兩個(gè)字符串值相等的變量,他們只會生成一個(gè)對象放到常量池中谍肤,然后兩個(gè)變量都指向它啦租,提升效率。1.2.安全性荒揣,如果String類可以被修改篷角,那么在多線程的情況下會造成安全漏洞。2.1 StringBuilder和StringBuffer的區(qū)別:他們都是創(chuàng)建字符串的常用類系任,長度都是可以擴(kuò)充的恳蹲,實(shí)現(xiàn)了CharSequence接口。StringBuilder非線程安全俩滥,StringBuffer線程安全嘉蕾,所以通常在單線程環(huán)境下可以考慮是用StringBuilder來提升速度和效率,而在多線程的環(huán)境下則應(yīng)該使用SringBuffer來保證線程安全霜旧。
3.反射错忱、accessible,動態(tài)代理的原理挂据,jdk動態(tài)代理與cglib的區(qū)別與各自的實(shí)現(xiàn)原理以清?
答:反射的機(jī)制是在編譯時(shí)并不確定的哪個(gè)類被jvm加載,在程序運(yùn)行的時(shí)候才加載崎逃、探知掷倔、自審。動態(tài)代理類的字節(jié)碼在程序運(yùn)行時(shí)由Java反射機(jī)制動態(tài)生成个绍,無需程序員手工編寫它的源代碼勒葱。cglib是針對類來實(shí)現(xiàn)代理的,他的原理是對指定的目標(biāo)類生成一個(gè)子類巴柿,并覆蓋其中方法實(shí)現(xiàn)增強(qiáng)凛虽,但因?yàn)椴捎玫氖抢^承,所以不能對final修飾的類進(jìn)行代理广恢。兩者區(qū)別:jdk的代理是利用反射生成字節(jié)碼凯旋,并生成對象,前提是只能代理實(shí)現(xiàn)了接口的類袁波,cglib是直接修改目標(biāo)類的字節(jié)碼生成對象瓦阐,因?yàn)樵硎抢^承蜗侈,所以不能對final修飾的類進(jìn)行代理篷牌。http://rejoy.iteye.com/blog/1627405https://my.oschina.net/tearsky/blog/635321
4.自動裝箱,賦值操作踏幻,在內(nèi)存里面是如何實(shí)現(xiàn)的?
答:自動裝箱是將內(nèi)置類型轉(zhuǎn)換為對應(yīng)的包裝類型枷颊,在自動裝箱的過程中,程序會創(chuàng)建一個(gè)包裝類型的對象,然后將該變量指向這個(gè)新創(chuàng)建的對象夭苗,完成裝箱操作信卡。
5.接口和抽象類的區(qū)別
答:
1、抽象類和接口都不能直接實(shí)例化题造,如果要實(shí)例化傍菇,抽象類變量必須指向?qū)崿F(xiàn)所有抽象方法的子類對象,接口變量必須指向?qū)崿F(xiàn)所有接口方法的類對象界赔。
2丢习、抽象類要被子類繼承,接口要被類實(shí)現(xiàn)淮悼。
3咐低、接口只能做方法申明,抽象類中可以做方法申明袜腥,也可以做方法實(shí)現(xiàn)见擦。
4叫胁、接口里定義的變量只能是公共的靜態(tài)的常量曙蒸,抽象類中的變量是普通變量。
5列粪、抽象類里的抽象方法必須全部被子類所實(shí)現(xiàn)特恬,如果子類不能全部實(shí)現(xiàn)父類抽象方法执俩,那么該子類只能是抽象類。同樣癌刽,一個(gè)實(shí)現(xiàn)接口的時(shí)候役首,如不能全部實(shí)現(xiàn)接口方法,那么該類也只能為抽象類显拜。
6衡奥、抽象方法只能申明,不能實(shí)現(xiàn)远荠,接口是設(shè)計(jì)的結(jié)果 矮固,抽象類是重構(gòu)的結(jié)果。
7譬淳、抽象類里可以沒有抽象方法档址。
8、如果一個(gè)類里有抽象方法邻梆,那么這個(gè)類只能是抽象類守伸。
9、抽象方法要被實(shí)現(xiàn)浦妄,所以不能是靜態(tài)的尼摹,也不能是私有的见芹。
10、接口可繼承接口蠢涝,并可多繼承接口玄呛,但類只能單根繼承。
6.concurrenthashmap的原理和二,內(nèi)部數(shù)據(jù)結(jié)構(gòu)徘铝,如何提高并發(fā)性,jdk8中做了哪些優(yōu)化惯吕。
答:ConcurrentHashMap允許多個(gè)修改操作并發(fā)進(jìn)行庭砍,其關(guān)鍵在于使用了鎖分離技術(shù)。它使用了多個(gè)鎖來控制對hash表的不同部分進(jìn)行的修改混埠。ConcurrentHashMap內(nèi)部使用段(Segment)來表示這些不同的部分怠缸,每個(gè)段其實(shí)就是一個(gè)小的hash table,它們有自己的鎖钳宪。只要多個(gè)修改操作發(fā)生在不同的段上揭北,它們就可以并發(fā)進(jìn)行。
改進(jìn)一:取消segments字段吏颖,直接采用transient volatile HashEntry[] table保存數(shù)據(jù)搔体,采用table數(shù)組元素作為鎖,從而實(shí)現(xiàn)了對每一行數(shù)據(jù)進(jìn)行加鎖半醉,進(jìn)一步減少并發(fā)沖突的概率疚俱。
改進(jìn)二:將原先table數(shù)組+單向鏈表的數(shù)據(jù)結(jié)構(gòu),變更為table數(shù)組+單向鏈表+紅黑樹的結(jié)構(gòu)缩多。對于hash表來說呆奕,最核心的能力在于將key hash之后能均勻的分布在數(shù)組中。如果hash之后散列的很均勻衬吆,那么table數(shù)組中的每個(gè)隊(duì)列長度主要為0或者1梁钾。但實(shí)際情況并非總是如此理想,雖然ConcurrentHashMap類默認(rèn)的加載因子為0.75逊抡,但是在數(shù)據(jù)量過大或者運(yùn)氣不佳的情況下姆泻,還是會存在一些隊(duì)列長度過長的情況,如果還是采用單向列表方式冒嫡,那么查詢某個(gè)節(jié)點(diǎn)的時(shí)間復(fù)雜度為O(n)拇勃;因此,對于個(gè)數(shù)超過8(默認(rèn)值)的列表孝凌,jdk1.8中采用了紅黑樹的結(jié)構(gòu)方咆,那么查詢的時(shí)間復(fù)雜度可以降低到O(logN),可以改進(jìn)性能胎许。
7.hashset的原理?
答:HashSet中add方法調(diào)用的是底層HashMap中的put()方法峻呛,而如果是在HashMap中調(diào)用put,首先會判斷key是否存在辜窑,如果key存在則修改value值钩述,如果key不存在這插入這個(gè)key-value。而在set中穆碎,因?yàn)関alue值沒有用牙勘,也就不存在修改value值的說法,因此往HashSet中添加元素所禀,首先判斷元素(也就是key)是否存在方面,如果不存在這插入,如果存在著不插入色徘,這樣HashSet中就不存在重復(fù)值恭金。
8.GC原理,分代機(jī)制褂策,可達(dá)性分析横腿?
答:對傳統(tǒng)的、基本的GC實(shí)現(xiàn)來說斤寂,由于它們在GC的整個(gè)工作過程中都要“stop-the-world”耿焊,如果能想辦法縮短GC一次工作的時(shí)間長度就是件重要的事情。如果說收集整個(gè)GC堆耗時(shí)太長遍搞,那不如只收集其中的一部分罗侯?于是就有好幾種不同的劃分(partition)GC堆的方式來實(shí)現(xiàn)部分收集,而分代式GC就是這其中的一個(gè)思路溪猿。
9.JVM參數(shù)有哪幾種钩杰,如何調(diào)優(yōu)?
-Xmx2g //JVM最大允許分配的堆內(nèi)存诊县,按需分配
-Xms2g //JVM初始分配的堆內(nèi)存榜苫,一般和Xmx配置成一樣以避免每次gc后JVM重新分配內(nèi)存。-Xmn256m //年輕代內(nèi)存大小翎冲,整個(gè)JVM內(nèi)存=年輕代 + 年老代 + 持久代年輕代分三個(gè)區(qū)垂睬,?分別是enden區(qū)和兩個(gè)survivor區(qū)。
10.JMM特性有哪些抗悍?
1.可見性:JMM提供了volatile變量定義驹饺、final、synchronized塊來保證可見性缴渊。
2.有序性:這個(gè)概念是相對而言的赏壹,如果在本線程內(nèi),所有的操作都是有序的衔沼,如果在一個(gè)線程觀察另一個(gè)線程蝌借,所有的操作都是無序的昔瞧,前句是“線程內(nèi)表現(xiàn)為串行行為”,后句是“指令的重排序”和“工作內(nèi)存和主內(nèi)存同步延遲”現(xiàn)象菩佑,模型提供了volatile和synchronized來保證線程之間操作的有序性自晰。
3.重排序:在執(zhí)行程序時(shí)為了提高性能,編譯器和處理器常常會對指令做重排序(編譯器稍坯、處理器)酬荞,就是因?yàn)檫@些重排序,所以可能會導(dǎo)致多線程程序出現(xiàn)內(nèi)存可見性問題(數(shù)據(jù)安全問題)和有序性問題瞧哟』烨桑可見性、原子性勤揩、有序性.
11咧党、什么是跳表?
二陨亡、多線程
1凿傅、線程有幾種狀態(tài)?之間是如何切換的数苫?
答:新建狀態(tài)聪舒、就緒狀態(tài)、運(yùn)行狀態(tài)虐急、阻塞狀態(tài)及死亡狀態(tài)箱残。主要是通過獲取鎖標(biāo)記來獲取對該資源的使用權(quán)限,當(dāng)對象調(diào)用了start()進(jìn)入到就緒狀態(tài)止吁,進(jìn)入就緒后被辑,當(dāng)該對象被操作系統(tǒng)選中,獲得CPU時(shí)間片就會進(jìn)入運(yùn)行狀態(tài)敬惦;接下來的狀態(tài)切換就會比較復(fù)雜盼理,主要通過線程調(diào)用不同的方法,就會切換不同的運(yùn)行狀態(tài)俄删。
2宏怔、volatile的作用(兩點(diǎn)),volatile的原理與應(yīng)用場景畴椰。
答:volatile讓變量每次在使用的時(shí)候臊诊,都從主存中取。(1.將當(dāng)前處理器緩存行的數(shù)據(jù)會寫回到系統(tǒng)內(nèi)存,2.這個(gè)寫回內(nèi)存的操作會引起在其他CPU里緩存了該內(nèi)存地址的數(shù)據(jù)無效斜脂。)而不是從各個(gè)線程的“工作內(nèi)存”抓艳。volatile具有synchronized關(guān)鍵字的“可見性”,但是沒有synchronized關(guān)鍵字的“并發(fā)正確性”帚戳,也就是說不保證線程執(zhí)行的有序性玷或,volatile變量對于每次使用儡首,線程都能得到當(dāng)前volatile變量的最新值。但是volatile變量并不保證并發(fā)的正確性偏友。
3蔬胯、線程安全是什么?如何做到線程安全约谈?怎么判斷一個(gè)類是不是線程安全?
答:類要成為線程安全的犁钟,首先必須在單線程環(huán)境中有正確的行為棱诱。如果一個(gè)類實(shí)現(xiàn)正確(這是說它符合規(guī)格說明的另一種方式),那么沒有一種對這個(gè)類的對象的操作序列(讀或者寫公共字段以及調(diào)用公共方法)可以讓對象處于無效狀態(tài)涝动,觀察到對象處于無效狀態(tài)迈勋、或者違反類的任何不可變量、前置條件或者后置條件的情況醋粟。此外靡菇,一個(gè)類要成為線程安全的,在被多個(gè)線程訪問時(shí)米愿,不管運(yùn)行時(shí)環(huán)境執(zhí)行這些線程有什么樣的時(shí)序安排或者交錯(cuò)厦凤,它必須仍然有如上所述的正確行為,并且在調(diào)用的代碼中沒有任何額外的同步育苟。其效果就是较鼓,在所有線程看來,對于線程安全對象的操作是以固定的违柏、全局一致的順序發(fā)生的博烂。正確性與線程安全性之間的關(guān)系非常類似于在描述 ACID(原子性、一致性漱竖、獨(dú)立性和持久性)事務(wù)時(shí)使用的一致性與獨(dú)立性之間的關(guān)系:從特定線程的角度看禽篱,由不同線程所執(zhí)行的對象操作是先后(雖然順序不定)而不是并行執(zhí)行的。
4馍惹、線程同步有幾種方式躺率?為何要使用同步?
答: java允許多線程并發(fā)控制万矾,當(dāng)多個(gè)線程同時(shí)操作一個(gè)可共享的資源變量時(shí)(如數(shù)據(jù)的增刪改查), 將會導(dǎo)致數(shù)據(jù)不準(zhǔn)確肥照,相互之間產(chǎn)生沖突,因此加入同步鎖以避免在該線程沒有完成操作之前勤众,被其他線程的調(diào)用, 從而保證了該變量的唯一性和準(zhǔn)確性舆绎。
同步的實(shí)現(xiàn)方式總共分為七種:
1.同步方法 :?即有synchronized關(guān)鍵字修飾的方法,由于java的每個(gè)對象都有一個(gè)內(nèi)置鎖们颜,當(dāng)用此關(guān)鍵字修飾方法時(shí)吕朵,內(nèi)置鎖會保護(hù)整個(gè)方法猎醇。在調(diào)用該方法前,需要獲得內(nèi)置鎖努溃,否則就處于阻塞狀態(tài)硫嘶。
2.同步代碼塊:即有synchronized關(guān)鍵字修飾的語句塊,被該關(guān)鍵字修飾的語句塊會自動被加上內(nèi)置鎖梧税,從而實(shí)現(xiàn)同步
3.使用特殊域變量(volatile)實(shí)現(xiàn)線程同步?
a.volatile關(guān)鍵字為域變量的訪問提供了一種免鎖機(jī)制沦疾。
b.使用volatile修飾域相當(dāng)于告訴虛擬機(jī)該域可能會被其他線程更新。
?c.因此每次使用該域就要重新計(jì)算第队,而不是使用寄存器中的值哮塞。
?d.volatile不會提供任何原子操作,它也不能用來修飾final類型的變量凳谦。
?4.使用重入鎖實(shí)現(xiàn)線程同步.
java.util.concurrent包下的ReentrantLock類是可重入忆畅、互斥、實(shí)現(xiàn)了Lock接口的鎖尸执,它與使用synchronized方法和快具有相同的基本行為和語義家凯,并且擴(kuò)展了其能力.
5.使用局部變量實(shí)現(xiàn)線程同步,如果使用ThreadLocal管理變量如失,則每一個(gè)使用該變量的線程都獲得該變量的副本绊诲, 副本之間相互獨(dú)立,這樣每一個(gè)線程都可以隨意修改自己的變量副本褪贵,而不會對其他線程產(chǎn)生影響
6.使用阻塞隊(duì)列實(shí)現(xiàn)線程同步驯镊,前面5種同步方式都是在底層實(shí)現(xiàn)的線程同步,但是我們在實(shí)際開發(fā)當(dāng)中竭鞍,應(yīng)當(dāng)盡量遠(yuǎn)離底層結(jié)構(gòu)板惑。使用javaSE5.0版本中新增的java.util.concurrent包將有助于簡化開發(fā)。使用LinkedBlockingQueue來實(shí)現(xiàn)線程的同步偎快, LinkedBlockingQueue是一個(gè)基于已連接節(jié)點(diǎn)的冯乘,范圍任意的blocking queue。隊(duì)列是先進(jìn)先出的順序(FIFO)晒夹。
7.使用原子變量實(shí)現(xiàn)線程同步裆馒,需要使用線程同步的根本原因在于對普通變量的操作不是原子的。原子操作就是指將讀取變量值丐怯、修改變量值喷好、保存變量值看成一個(gè)整體來操作,即-這幾種行為要么同時(shí)完成读跷,要么都不完成梗搅。在java的util.concurrent.atomic包中提供了創(chuàng)建了原子類型變量的工具類,使用該類可以簡化線程同步。其中AtomicInteger 表可以用原子方式更新int的值无切,可用在應(yīng)用程序中(如以原子方式增加的計(jì)數(shù)器)荡短,但不能用于替換Integer;可擴(kuò)展Number哆键,允許那些處理機(jī)遇數(shù)字類的工具和實(shí)用工具進(jìn)行統(tǒng)一訪問掘托。
5、threadlocal的原理
答:ThreadLocal提供了set和get訪問器用來訪問與當(dāng)前線程相關(guān)聯(lián)的線程局部變量籍嘹。當(dāng)線程中的threadlocalmap是null的時(shí)候闪盔,會調(diào)用createmap創(chuàng)建一個(gè)map。同時(shí)根據(jù)函數(shù)參數(shù)設(shè)置上初始值辱士。也就是說泪掀,當(dāng)前線程的threadlocalmap是在第一次調(diào)用set的時(shí)候創(chuàng)建map并且設(shè)置上相應(yīng)的值的。在ThreadLocal的set函數(shù)中识补,可以看到族淮,其中的map.set(this, value);把當(dāng)前的threadlocal傳入到map中作為鍵辫红,也就是說凭涂,在不同的線程的threadlocals變量中,都會有一個(gè)以你所聲明的那個(gè)線程局部變量threadlocal作為鍵的key-value贴妻。假設(shè)說聲明了N個(gè)這樣的線程局部變量變量切油,那么在線程的ThreadLocalMap中就會有n個(gè)分別以你的線程局部變量作為key的鍵值對。
6名惩、synchronized是如何實(shí)現(xiàn)的澎胡?
答:每個(gè)對象有一個(gè)監(jiān)視器鎖(monitor)。當(dāng)monitor被占用時(shí)就會處于鎖定狀態(tài)娩鹉,線程執(zhí)行monitorenter指令時(shí)嘗試獲取monitor的所有權(quán)攻谁,過程如下:
1、如果monitor的進(jìn)入數(shù)為0弯予,則該線程進(jìn)入monitor戚宦,然后將進(jìn)入數(shù)設(shè)置為1,該線程即為monitor的所有者锈嫩。
2受楼、如果線程已經(jīng)占有該monitor,只是重新進(jìn)入呼寸,則進(jìn)入monitor的進(jìn)入數(shù)加1.
3.如果其他線程已經(jīng)占用了monitor艳汽,則該線程進(jìn)入阻塞狀態(tài),直到monitor的進(jìn)入數(shù)為0对雪,再重新嘗試獲取monitor的所有權(quán)河狐。
對于方法的同步,方法的同步并沒有通過指令monitorenter和monitorexit來完成(理論上其實(shí)也可以通過這兩條指令來實(shí)現(xiàn)),不過相對于普通方法甚牲,其常量池中多了ACC_SYNCHRONIZED標(biāo)示符义郑。JVM就是根據(jù)該標(biāo)示符來實(shí)現(xiàn)方法的同步的:當(dāng)方法調(diào)用時(shí),調(diào)用指令將會檢查方法的 ACC_SYNCHRONIZED 訪問標(biāo)志是否被設(shè)置丈钙,如果設(shè)置了非驮,執(zhí)行線程將先獲取monitor,獲取成功之后才能執(zhí)行方法體雏赦,方法執(zhí)行完后再釋放monitor劫笙。在方法執(zhí)行期間,其他任何線程都無法再獲得同一個(gè)monitor對象星岗。 其實(shí)本質(zhì)上沒有區(qū)別填大,只是方法的同步是一種隱式的方式來實(shí)現(xiàn),無需通過字節(jié)碼來完成俏橘。
7允华、sleep和wait的區(qū)別?
答:sleep()方法導(dǎo)致了程序暫停執(zhí)行指定的時(shí)間寥掐,讓出cpu給其他線程靴寂,但是他的監(jiān)控狀態(tài)依然保持者,當(dāng)指定的時(shí)間到了又會自動恢復(fù)運(yùn)行狀態(tài)召耘。在調(diào)用sleep()方法的過程中百炬,線程不會釋放對象鎖。而當(dāng)調(diào)用wait()方法的時(shí)候污它,線程會放棄對象鎖剖踊,進(jìn)入等待此對象的等待鎖定池,只有針對此對象調(diào)用notify()方法后本線程才進(jìn)入對象鎖定池準(zhǔn)備衫贬,獲取對象鎖進(jìn)入運(yùn)行狀態(tài)德澈。
8、線程池有幾種固惯?各自的應(yīng)用場景梆造。
答:1.newFixedThreadPool創(chuàng)建一個(gè)指定工作線程數(shù)量的線程池。每當(dāng)提交一個(gè)任務(wù)就創(chuàng)建一個(gè)工作線程缝呕,如果工作線程數(shù)量達(dá)到線程池初始的最大數(shù)澳窑,則將提交的任務(wù)存入到池隊(duì)列中。2.newCachedThreadPool創(chuàng)建一個(gè)可緩存的線程池供常。這種類型的線程池特點(diǎn)是:
1).工作線程的創(chuàng)建數(shù)量幾乎沒有限制(其實(shí)也有限制的,數(shù)目為Interger. MAX_VALUE), 這樣可靈活的往線程池中添加線程摊聋。
2).如果長時(shí)間沒有往線程池中提交任務(wù),即如果工作線程空閑了指定的時(shí)間(默認(rèn)為1分鐘)栈暇,則該工作線程將自動終止麻裁。終止后,如果你又提交了新的任務(wù),則線程池重新創(chuàng)建一個(gè)工作線程煎源。
3.newSingleThreadExecutor創(chuàng)建一個(gè)單線程化的Executor色迂,即只創(chuàng)建唯一的工作者線程來執(zhí)行任務(wù),如果這個(gè)線程異常結(jié)束手销,會有另一個(gè)取代它歇僧,保證順序執(zhí)行(我覺得這點(diǎn)是它的特色)。單工作線程最大的特點(diǎn)是可保證順序地執(zhí)行各個(gè)任務(wù)锋拖,并且在任意給定的時(shí)間不會有多個(gè)線程是活動的诈悍。
4.newScheduleThreadPool創(chuàng)建一個(gè)定長的線程池,而且支持定時(shí)的以及周期性的任務(wù)執(zhí)行兽埃,類似于Timer侥钳。
總結(jié):?
一.FixedThreadPool是一個(gè)典型且優(yōu)秀的線程池,它具有線程池提高程序效率和節(jié)省創(chuàng)建線程時(shí)所耗的開銷的優(yōu)點(diǎn)柄错。但是舷夺,在線程池空閑時(shí),即線程池中沒有可運(yùn)行任務(wù)時(shí)售貌,它不會釋放工作線程给猾,還會占用一定的系統(tǒng)資源。
二.CachedThreadPool的特點(diǎn)就是在線程池空閑時(shí)趁矾,即線程池中沒有可運(yùn)行任務(wù)時(shí)耙册,它會釋放工作線程给僵,從而釋放工作線程所占用的資源毫捣。但是,但當(dāng)出現(xiàn)新任務(wù)時(shí)帝际,又要?jiǎng)?chuàng)建一新的工作線程蔓同,又要一定的系統(tǒng)開銷。并且蹲诀,在使用CachedThreadPool時(shí)斑粱,一定要注意控制任務(wù)的數(shù)量,否則脯爪,由于大量線程同時(shí)運(yùn)行则北,很有會造成系統(tǒng)癱瘓。
9痕慢、線程池的原理尚揣,主要有幾個(gè)參數(shù)?線程池滿了怎么辦掖举?
答:
減少在創(chuàng)建和銷毀線程上所花的時(shí)間以及系統(tǒng)資源的開銷快骗。
如不使用線程池,有可能造成系統(tǒng)創(chuàng)建大量線程而導(dǎo)致消耗完系統(tǒng)內(nèi)存以及”過度切換”。
10方篮、Semaphore名秀、countdownlatch、futureTask
答:
11藕溅、submit和execute的區(qū)別匕得。
答:execute(Runnable x) 沒有返回值〗肀恚可以執(zhí)行任務(wù)耗跛,但無法判斷任務(wù)是否成功完成≡芊ⅲ——實(shí)現(xiàn)Runnable接口
submit(Runnable x) 返回一個(gè)future调塌。可以用這個(gè)future來判斷任務(wù)是否成功完成惠猿「崂——實(shí)現(xiàn)Callable接口。
12偶妖、Future接口的幾個(gè)主要方法
答:
13姜凄、創(chuàng)建線程有幾種方式
答:1.繼承Thread類創(chuàng)建線程類
2.通過Runnable接口創(chuàng)建線程類
3.通過Callable和Future創(chuàng)建線程
14、可重入鎖是如何實(shí)現(xiàn)的
答:
三趾访、數(shù)據(jù)庫
1态秧、MySQL索引原理?為什么是B+樹扼鞋?有什么優(yōu)點(diǎn)申鱼?
1.文件很大,不可能全部存儲在內(nèi)存中云头,故要存儲到磁盤上捐友,索引的結(jié)構(gòu)組織要盡量減少查找過程中磁盤I/O的存取次數(shù),
2溃槐、事務(wù)隔離級別有哪幾種匣砖?mysql默認(rèn)的隔離級別是?臟讀昏滴、幻讀猴鲫、不可重復(fù)讀是什么情況?
答:谣殊,由低到高分別為Read uncommitted 拂共、Read committed 、Repeatable read 蟹倾、Serializable匣缘,
3猖闪、MVCC原理
4、mysql有哪幾種鎖肌厨?
答:共享讀鎖培慌,獨(dú)占寫鎖。根據(jù)數(shù)據(jù)引擎的不同柑爸,鎖的類型也不一樣吵护,對于innodb
5、mysql的存儲引擎有哪幾種表鳍?區(qū)別和各自的適用場景馅而。
6、query cache的配置
7譬圣、ACID
原子性瓮恭、一致性、隔離性厘熟、持久性屯蹦。
8、如何優(yōu)化慢查詢
答:1.查詢條件帶上索引绳姨,
9登澜、最左前綴匹配原則,原理
四飘庄、算法
1脑蠕、一致性哈希的原理
2、手寫二分查找跪削,快速排序
3谴仙、手寫LRU算法
4、兩個(gè)鏈表找交點(diǎn)
5切揭、兩個(gè)無限長的數(shù)字求和
6狞甚、手寫生產(chǎn)者消費(fèi)者demo
7锁摔、256M內(nèi)存排序2G大小的文件
8廓旬、求數(shù)組最大子序列
五、操作系統(tǒng)與計(jì)算機(jī)網(wǎng)絡(luò)
1谐腰、如何從訪問日志中找出量最大的10個(gè)ip孕豹?awk語句了解嗎?
2十气、jstack励背,jstat,jmap砸西,jheap命令了解嗎叶眉,如何使用址儒?
3、系統(tǒng)負(fù)載情況如何查看衅疙?
4莲趣、網(wǎng)絡(luò)分層協(xié)議了解嗎?
5饱溢、tcp三次握手喧伞,四次揮手了解嗎?
6绩郎、aio潘鲫,bio,nio的區(qū)別
7肋杖、select溉仑,poll,epoll的區(qū)別状植?
8彼念、io模型有哪些?
六浅萧、開源框架與組件
這部分主要根據(jù)簡歷以及項(xiàng)目的實(shí)際情況來問逐沙。