聊聊基礎(chǔ)

一:基礎(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í)際情況來問逐沙。

1、對spring了解嗎洼畅?ioc吩案,aop,transaction注解

2帝簇、spingmvc了解嗎徘郭?

3、Redis與memcache的區(qū)別

4丧肴、redis持久化策略残揉,rdb與aof的區(qū)別與應(yīng)用場景

5、memcached的內(nèi)存是如何分配的芋浮?一致性哈希原理

6抱环、mq的原理與應(yīng)用場景,mq是如何保證不丟消息的纸巷?

7镇草、tomcat的原理,主要運(yùn)用了哪些設(shè)計(jì)模式瘤旨?

8梯啤、redis與memcached內(nèi)存分別是如何回收的?

9存哲、guava的緩存是怎么實(shí)現(xiàn)的因宇?

七七婴、場景設(shè)計(jì)與架構(gòu)

1、秒殺場景察滑,如何做技術(shù)選型本姥?

2、設(shè)計(jì)一個(gè)支持高并發(fā)的服務(wù)杭棵,寫出核心代碼

3婚惫、高并發(fā)與高可用如何實(shí)現(xiàn)?

4魂爪、服務(wù)降級怎么做先舷?限流、限速滓侍、超時(shí)重試蒋川、熔斷、自恢復(fù)撩笆、分別如何實(shí)現(xiàn)捺球?

5、什么是微服務(wù)夕冲?有什么好處氮兵?為什么要這么做?

6歹鱼、CAP理論是什么泣栈?項(xiàng)目中的哪些場景用到了CAP理論?

7弥姻、BASE理論是什么南片?

8、什么時(shí)候應(yīng)該使用mq庭敦?

八疼进、其他

1、平時(shí)都通過什么方式學(xué)習(xí)技術(shù)秧廉?

2伞广、最近學(xué)的一個(gè)知識點(diǎn)是什么?

3定血、對帶人有什么經(jīng)驗(yàn)赔癌?

4、最熟悉的一個(gè)項(xiàng)目是什么澜沟?

5、跳槽的時(shí)候峡谊,你最看重什么茫虽?

6刊苍、為什么跳槽?為什么選擇我們公司濒析?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末正什,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子号杏,更是在濱河造成了極大的恐慌婴氮,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盾致,死亡現(xiàn)場離奇詭異主经,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)庭惜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門罩驻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人护赊,你說我怎么就攤上這事惠遏。” “怎么了骏啰?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵节吮,是天一觀的道長。 經(jīng)常有香客問我判耕,道長课锌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任祈秕,我火速辦了婚禮渺贤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘请毛。我一直安慰自己志鞍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布方仿。 她就那樣靜靜地躺著固棚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仙蚜。 梳的紋絲不亂的頭發(fā)上此洲,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音委粉,去河邊找鬼呜师。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贾节,可吹牛的內(nèi)容都是我干的汁汗。 我是一名探鬼主播衷畦,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼知牌!你這毒婦竟也來了祈争?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤角寸,失蹤者是張志新(化名)和其女友劉穎菩混,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扁藕,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沮峡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纹磺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帖烘。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖橄杨,靈堂內(nèi)的尸體忽然破棺而出秘症,到底是詐尸還是另有隱情,我是刑警寧澤式矫,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布乡摹,位于F島的核電站,受9級特大地震影響采转,放射性物質(zhì)發(fā)生泄漏聪廉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一故慈、第九天 我趴在偏房一處隱蔽的房頂上張望板熊。 院中可真熱鬧,春花似錦察绷、人聲如沸干签。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽容劳。三九已至,卻和暖如春闸度,著一層夾襖步出監(jiān)牢的瞬間竭贩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工莺禁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留支救,地道東北人读串。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓巨柒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寝凌。 傳聞我的和親對象是個(gè)殘疾皇子柒傻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在孝赫,面了一些公司,掛了不少红符,但最終還是拿到小米青柄、百度、阿里预侯、京東致开、新浪、CVTE萎馅、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,246評論 11 349
  • Java8張圖 11双戳、字符串不變性 12、equals()方法糜芳、hashCode()方法的區(qū)別 13飒货、...
    Miley_MOJIE閱讀 3,704評論 0 11
  • 大環(huán)線: D1、廣州--西寧 D3峭竣、塔爾寺--拉脊山--日月山--倒淌河--黑馬河 D4塘辅、黑馬河日出-茶卡鹽湖--...
    秦淵秦公子閱讀 607評論 0 4
  • 從前慢吞吞閱讀 358評論 0 0
  • 我喜歡你告訴我不曾告訴別人的心情 我喜歡你帶我做和別人不曾做過的事情 我喜歡你偶爾像個(gè)孩子依賴我的樣子 我喜歡你...
    Meridian閱讀 142評論 0 0