Java面試問題準(zhǔn)備(新)

一示启、項目類

  1. 意義最大的項目

  2. 項目中遇到的最困難的問題

3湃密、項目中用到的設(shè)計模式

責(zé)任鏈模式巫员,工廠

4庶香、項目的結(jié)構(gòu)框圖(支付系統(tǒng)的流程)

二、Java源碼類

1简识、hashmap和concurrenthashmap的區(qū)別和優(yōu)缺點

hashmap線程不安全赶掖,chashmap線程安全

2、加解密算法七扰,RSA奢赂,jdk的一些加密api

3、

三颈走、多線程類

1膳灶、自增的原子性

2、volatile (long類型的原子性) http://www.cnblogs.com/dolphin0520/p/3920373.html

cpu存在各自的高速緩存立由,兩個線程同時操作自己cpu的高速緩存中的值轧钓,再寫入內(nèi)存,可能會出現(xiàn)和預(yù)期結(jié)果不一致的情況锐膜,這就是緩存一致性問題毕箍。解決緩存一致性問題,主要有兩種方式:

1道盏、在總線加LOCK#指令

2而柑、緩存一致性協(xié)議

起初通過總線加鎖實現(xiàn),但是在加鎖期間捞奕,其他CPU不能訪問內(nèi)存牺堰,效率有一絲低下。所以緩存一致性協(xié)議應(yīng)運而生颅围。核心思想是伟葫,當(dāng)CPU在操作一個共享變量的時候,發(fā)出信號通知其他CPU將自己緩存里的變量設(shè)置為無效狀態(tài)院促,等下次其他CPU再去操作這個變量的時候筏养,發(fā)現(xiàn)緩存中變量狀態(tài)是無效,就會去內(nèi)存里讀取常拓,這樣值就保證了一致

3渐溶、lock的實現(xiàn)

lock的鎖實現(xiàn)是基于一個內(nèi)部類Sync實現(xiàn)的,內(nèi)部類Sync的實現(xiàn)則是基于JUC包中的并發(fā)組件的基礎(chǔ)框架AQS弄抬,Sync有兩個子類茎辐,分別的公平和不公平,對應(yīng)了公平鎖和不公平鎖的兩種實現(xiàn)方式。默認(rèn)是不公平鎖拖陆,在不公平鎖的lock方法被調(diào)用時弛槐,線程會直接嘗試acs的方式設(shè)置state的值為1,也就是說直接獲取鎖而不排隊依啰,所以叫不公平鎖乎串。如果值設(shè)置成功,也就是說當(dāng)前線程已經(jīng)獲取了鎖了速警,那將當(dāng)前持有線程的變量值設(shè)置為當(dāng)前線程叹誉,ownerThread這個變量是AQS的父類定義的一個變量。如果acs沒有設(shè)值成功闷旧,則進入acquire方法嘗試獲取鎖长豁,首先調(diào)用的是tryAcquire方法,這個方法AQS是沒有給出實現(xiàn)的鸠匀,而是將實現(xiàn)留給了子類蕉斜,意味著子類可以根據(jù)公平或不公平逾柿,或者其它原則來實現(xiàn)這個獲取鎖的過程缀棍。非公平鎖的話首先還是ACS得方式將state值設(shè)置為1,如果成功則意味著成功獲取了鎖机错,那接下來的操作和之前一樣爬范,將持有鎖的線程設(shè)置為當(dāng)前線程,然后返回弱匪,如果沒有成功青瀑,則說明鎖被其它線程正持有,那就接著判斷持有鎖的線程和當(dāng)前獲取鎖的線程是不是同一個線程萧诫,如果是的話斥难,就將state+1,返回帘饶,這意思就是說ReetrantLock是可重入的哑诊,當(dāng)前線程可以重復(fù)持有多次鎖,只要使用完成后釋放相應(yīng)多的次數(shù)即可及刻。AQS的state在不同的子類里代表不同的意思镀裤,在ReetrantLock中就表示了當(dāng)前線程的鎖的次數(shù)。兩次嘗試都沒有成功的話缴饭,tryAcquire方法返回false暑劝,AQS調(diào)用acquireQueued方法,將當(dāng)前線程加入到等待隊列中颗搂,然后調(diào)用當(dāng)前請求鎖的線程的interrupt方法將線程阻塞担猛。

4、AQS的實現(xiàn)

AQS通過模板方法模式為子類的實現(xiàn)定下基調(diào)。AQS中規(guī)范了acquire和release的流程傅联,但是tryAcquire和tryRelease留給子類自己實現(xiàn)智嚷。AQS中維護了一個int類型的變量status,這個變量的使用很自由纺且,子類可以任意定義變量所表示的含義盏道,例如最常見的ReentrantLock中status就用來表示鎖被線程持有的次數(shù)。AQS中維護了一個隊列來放置等待獲取鎖的被阻塞的線程载碌,每個線程被構(gòu)造成一個Node對象猜嘱。

5、線程池的實現(xiàn)原理嫁艇,參數(shù)的用處 https://www.cnblogs.com/KingJack/p/9595621.html

execute方法:

workerCountOf(c) 獲取當(dāng)前線程池的線程數(shù)朗伶,如果小于指定容量,則addWorker

如果addWorker失敗步咪,或者當(dāng)前線程數(shù)b不小于線程池容量

如果線程池還在工作而且向工作隊列中添加任務(wù)成功论皆,則進行一次recheck檢查線程池當(dāng)前的線程數(shù)是否小于線程池的容量,如果線程池沒有在running猾漫,將任務(wù)從隊列中移除点晴,并且調(diào)用reject。如果線程池還在running悯周,但是當(dāng)前線程池數(shù)量為0粒督,則新建任務(wù)

如果線程池沒有在工作或者向工作隊列中添加任務(wù)線程不成功,那么嘗試直接創(chuàng)建新線程來執(zhí)行任務(wù)禽翼,如果失敗屠橄,reject方法調(diào)用

addWorker方法:

6、volatile能使得非原子操作變成原子的嗎

能闰挡。long和double

7锐墙、什么是線程局部變量

8、線程通信的方式

1长酗、最容易想到的溪北,共享變量,用synchronized花枫,volatile等修飾的變量刻盐,可以用作線程之間的通信

2、隊列劳翰,生產(chǎn)者消費者不同的線程之間用隊列來共享內(nèi)容

3敦锌、Condition

4、notify()

9佳簸、Happen Before

如果一個操作的結(jié)果需要對另一個操作可見乙墙,這兩個操作就是happens-before關(guān)系

包括:

書寫操作按照代碼的順序發(fā)生

unlock發(fā)生在下一個lock之前

讀操作發(fā)生在寫操作之前

線程的start發(fā)生在線程的其他動作之前

總的來說就是指令執(zhí)行按照代碼的順序執(zhí)行颖变,如果前后代碼存在關(guān)聯(lián)關(guān)系

這些原則都是原生Java就滿足的happens-before原則,是Java語言天生具備的有序性

10听想、AtomicInteger等原子類

11腥刹、ReentrantLock和synchronized的區(qū)別

1、Reen可以控制公平性汉买,syn是天生非公平的衔峰。

2、Reen提供中斷等待蛙粘,超時等操作垫卤,syn不可以。

12出牧、countdownlatch源碼 http://www.reibang.com/p/2effb6b3e6c6

13穴肘、避免重復(fù)創(chuàng)建線程

https://blog.csdn.net/MingHuang2017/article/details/79571529

14、多線程的同步和互斥有哪幾種方法

1舔痕、臨界區(qū):通過對多線程的串行化來訪問公共資源或一段代碼评抚,速度快,適合控制數(shù)據(jù)訪問伯复。

2慨代、互斥量:為協(xié)調(diào)共同對一個共享資源的單獨訪問而設(shè)計的。

3边翼、信號量:為控制一個具有有限數(shù)量用戶資源而設(shè)計鱼响。

4、事 件:用來通知線程有一些事件已發(fā)生组底,從而啟動后繼任務(wù)的開始。

15筐骇、批量執(zhí)行異步任務(wù)

四债鸡、JVM類

1、Java的垃圾回收機制

Java內(nèi)存分為新生代铛纬,老年代,再細(xì)分可以分為eden棺弊,兩個survivor區(qū)模她,新創(chuàng)建的對象被分配在eden區(qū),當(dāng)分配不下時畜侦,觸發(fā)新生代GC旋膳,將存活的對象復(fù)制到其中一個survivor區(qū)验懊,判斷對象是否應(yīng)該被回收常見的有兩種算法咏连,一種是引用計數(shù),一種是可達性分析鲁森,引用計數(shù)是為對象添加一個引用計數(shù)器祟滴,如果引用計數(shù)器是0則可以被回收,這種方法在某些情況下會導(dǎo)致內(nèi)存泄漏歌溉,比如說循環(huán)引用垄懂,可達性分析是指定一些對象作為GC Roots,可以作為gcroots的對象一般是本地變量表中的對象草慧,靜態(tài)類屬性,常量引用的對象等,從這些對象出發(fā)的調(diào)用鏈到達不了的對象蹂析,會被認(rèn)定為是需要回收的對象。值得注意的是电抚,虛擬機在分析對象的引用關(guān)系時惕稻,為了防止引用關(guān)系發(fā)生變化蝙叛,會暫停所有線程,就是常說的stoptheworld。當(dāng)對象被認(rèn)定為是需要回收的對象,則虛擬機會將其回收唇撬,回收算法有很多種扑浸,新生代使用以空間換時間的復(fù)制清除酝惧,除此之外還有標(biāo)記清除,標(biāo)記整理等,例如在老年代這種不需要額外空間來爭取效率的場景就會使用標(biāo)記清除或者標(biāo)記整理。

常見的收集器:

G1:全區(qū)域的垃圾收集届谈,

2枯夜、JVM是如何實現(xiàn)反射的

3、jvm調(diào)優(yōu)的參數(shù)

4艰山、雙親委派機制湖雹,哪些情況違反了,雙親委派的好處

回答:哪些情況違反:

1曙搬、jdk1.2之前就已經(jīng)實現(xiàn)的類加載器

2、基礎(chǔ)類需要回調(diào)用戶代碼的時候征讲,線程上下文類加載器诗箍,可以使父加載器去請求子類加載器癣籽,實現(xiàn)逆向的加載

3、OSGI模塊化熱部署滤祖,實現(xiàn)的類加載器是網(wǎng)狀結(jié)構(gòu)筷狼,而非雙親委派模型的樹狀結(jié)構(gòu),類加載器可以委派同級別的其它類加載器完成

雙親委派的好處:具備天生的優(yōu)先級關(guān)系匠童,使得同一個根類在不同的類加載環(huán)境中加載出來的都是一樣的對象埂材。例如Object類無論何時加載都得到一樣的對象。

5汤求、stop the world是咋回事

回答:虛擬機在GC之前需要判斷對象是否存活俏险,常見的有兩種算法,引用計數(shù)和可達性分析首昔。HotSpot的基于可達性分析算法實現(xiàn)的寡喝,可達性分析算法必須要求定義一系列的GCRoots節(jié)點,并且在進行分析工作時這些節(jié)點的引用關(guān)系不能動態(tài)變化勒奇,不然分析的準(zhǔn)確性得不到保證预鬓,因此在整個分析的過程中,所有的Java線程都將被停頓赊颠,sun將這件事稱為stop the world格二。

6、內(nèi)存泄漏和內(nèi)存溢出

7竣蹦、Java類文件結(jié)構(gòu)

Java虛擬機不與任何語言綁定顶猜,只能運行字節(jié)碼的class文件。變量痘括,關(guān)鍵字长窄,運算符等都是由不同的字節(jié)碼組合而成。

class文件是以8字節(jié)為基礎(chǔ)單位的一組二進制流纲菌。Class文件只有兩種數(shù)據(jù)類型:無符號數(shù)和表挠日。無符號數(shù)包括u1,u2,u4,u8四種,分別代表一個字節(jié)翰舌,2個嚣潜,4個,8個字節(jié)椅贱。表是由無符號數(shù)和其它表組合而成的復(fù)雜數(shù)據(jù)結(jié)構(gòu)懂算,所有的表都習(xí)慣性的以_info結(jié)尾只冻。整個Class文件實際上就是一張表。

每個Class文件的頭四個字節(jié)都是魔數(shù)计技,標(biāo)記Class文件的合法性喜德。接下來4-2-2個字節(jié)分別是文件版本號次版本號和主版本號。主版本號之后緊接著是常量池的入口酸役,常量池的常量數(shù)量不是固定的住诸,所以常量池入口需要放置一個u2類型的數(shù)據(jù)代表常量池的計數(shù)值,且計數(shù)是從1開始而不是從0開始的涣澡。常量池當(dāng)中存放字面量和符號引用

常量池結(jié)束之后贱呐,緊接著兩個字節(jié)代表訪問標(biāo)志--access_flags。這個標(biāo)志用于識別類信息入桂,例如class是類還是接口奄薇,是public還是private等等。access_flags一共有16位抗愁,但是目前只使用了8位馁蒂,b其余的位用0填充。

類索引和父類索引都是u2類型的數(shù)據(jù)蜘腌,但是接口索引是u2類型的數(shù)據(jù)集沫屡。Class文件依據(jù)這三種數(shù)據(jù)來判斷類的繼承關(guān)系。父類索引只有一個撮珠。Object類的父類索引位為0 沮脖。這三類索引數(shù)據(jù)按順序排在訪問標(biāo)志之后。

緊接著是字段表芯急。字段表包含了類級變量和實例變量勺届,但是不包含方法中的局部變量。

緊接著是方法表娶耍。數(shù)據(jù)含義與字段表類似免姿,但是由于volatile等關(guān)鍵字不能修飾方法,因此標(biāo)志位少了幾個榕酒。方法里的代碼胚膊,被編譯成字節(jié)碼存放在方法表中的一個code字段。

8想鹰、字節(jié)碼指令簡介:

1)加載和存儲指令

五澜掩、Spring

1、Spring bean的生命周期

  • Spring容器 從XML 文件中讀取bean的定義杖挣,并實例化bean。
  • Spring根據(jù)bean的定義填充所有的屬性刚陡。
  • 如果bean實現(xiàn)了BeanNameAware 接口惩妇,Spring 傳遞bean 的ID 到 setBeanName方法株汉。
  • 如果Bean 實現(xiàn)了 BeanFactoryAware 接口, Spring傳遞beanfactory 給setBeanFactory 方法歌殃。
  • 如果有任何與bean相關(guān)聯(lián)的BeanPostProcessors乔妈,Spring會在postProcesserBeforeInitialization()方法內(nèi)調(diào)用它們。
  • 如果bean實現(xiàn)IntializingBean了氓皱,調(diào)用它的afterPropertySet方法路召,如果bean聲明了初始化方法,調(diào)用此初始化方法波材。
  • 如果有BeanPostProcessors 和bean 關(guān)聯(lián)股淡,這些bean的postProcessAfterInitialization() 方法將被調(diào)用。
  • 如果bean實現(xiàn)了 DisposableBean廷区,它將調(diào)用destroy()方法唯灵。
4.png

2、Spring的元注解

3隙轻、xml 中配置的 init埠帕、destroy 方法怎么可以做到調(diào)用具體的方法

4、applicationContext.xml是怎么被加載的

XmlBeanFactory 或ClassPathXmlApplicationContext加載xml文件

getInputStream獲取文件流

doLoadBeanDefinitions方法 讀取xml文件 SAX解析出Document對象

驗證xml文件的格式規(guī)范玖绿,加載命名空間敛瓷,下載dtd

BeanDefinitionDocumentReader .registerBeanDefinitions() 加載xml中定義的bean

registerBeanDefinitions方法中,又調(diào)用parseDefaultElement等方法來解析import標(biāo)簽斑匪,bean標(biāo)簽等等

5呐籽、spring aop的實現(xiàn)原理白热,動態(tài)代理

aop中的動態(tài)代理:

1梁只、JDK動態(tài)代理:代理對象與被代理對象實現(xiàn)同一接口

Proxy.newProxyInstance JDK反射包提供的工廠,Class對象在運行時以 參數(shù)形式傳入锄贷,也就是說代理關(guān)系是在運行時指定的苍姜,不是在編譯時指定的牢酵,因此是動態(tài)代理,和靜態(tài)的有區(qū)分衙猪,字節(jié)碼級別的代理對象

2馍乙、CGLIB:被代理類不需要強制實現(xiàn)接口,通過實現(xiàn)MethodInterceptor 垫释,重寫intercept方法丝格,dubboxieyidt tedian

所有的動態(tài)代理,都是在運行時生成被代理的子類棵譬。spring aop根據(jù)被代理的子類是否實現(xiàn)了接口显蝌,選擇使用哪一種代理方式,【問題:如何知道是否實現(xiàn)了接口呢】

6订咸、spring攔截器

7曼尊、spring事務(wù)

7大傳播特性

有事務(wù)酬诀,加入,沒有就新建

有事務(wù)骆撇,加入瞒御,沒有就非事務(wù)

有事務(wù),加入神郊,沒有拋出異常

有事務(wù)肴裙,嵌套(等于還是新建了一個)

有事務(wù),掛起當(dāng)前涌乳,新建一個

有事務(wù)蜻懦,掛起當(dāng)前,非事務(wù)執(zhí)行

有事務(wù)爷怀,拋出異常阻肩,沒有就非事務(wù)

5種隔離級別:

默認(rèn)和數(shù)據(jù)庫的一樣

未提交讀:沒提交就能讀

已提交讀:提交了才能讀

可重復(fù)讀:

串行化

8、springMVC dispatcherServlet源碼

六运授、MyBatis

1烤惊、mybatis接口和xml映射 https://blog.csdn.net/birthmarkqiqi/article/details/68939535

1、MapperRegistry 類注冊了所有mapper接口

2吁朦、MapperProxyFactory是mapper代理類工廠

3柒室、在factory中調(diào)用Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface },mapperProxy); 創(chuàng)建mapper的代理類。這是jdk的動態(tài)代理

mapperProxy就是扮演了InovationHandler的角色逗宜,在方法調(diào)用前后進行代理

mapperProxy有invoke方法雄右,通過將method作為參數(shù)傳入cachedMapperMethod方法,獲取到MapperMethod 纺讲,即執(zhí)行sql的封裝對象擂仍,然后再execute對應(yīng)的sql

sql語句是從哪里來?Method對應(yīng)了接口的方法熬甚,所以method對象在cachedMapperMethod方法里逢渔,創(chuàng)建了MapperMethod對象,而MapperMethod中有一個SqlCommand對象乡括,保存了sql的信息肃廓。至于信息的轉(zhuǎn)換,sql的填充等等诲泌,都是在SqlCommand的構(gòu)造方法里實現(xiàn)的盲赊,里邊有一個resolveMappedStatement方法,解析出MappedStatement對象敷扫。

MapperMethod 持有了一些sql的信息哀蘑,調(diào)用其execute方法,就可以執(zhí)行sql了。在execute內(nèi)部递礼,調(diào)用的是rowCountResult方法來執(zhí)行sql的惨险。

2、mybatis一對多查詢

七脊髓、Dubbo

1、dubbo實現(xiàn)原理 https://blog.csdn.net/u013076044/article/list/2?

是一個分布式框架栅受,分為服務(wù)消費者将硝,服務(wù)提供者,注冊中心等幾個角色屏镊。注冊中心會對服務(wù)的提供者進行實時的心跳檢測依疼,發(fā)現(xiàn)變化之后將最近的serverList推送給消費者,消費者在本地會緩存一份而芥。一個服務(wù)新注冊的時候律罢,會主動向注冊中心發(fā)送心跳。

dubbo是基于spring的命名空間加載的棍丐,spring在裝配bean 的時候误辑,遇上dubbo的命名空間,就會調(diào)用DubboNamespaceHandler來加載對象歌逢。

Dubbo會在Spring實例化完bean之后巾钉,在刷新容器最后一步發(fā)布ContextRefreshEvent事件的時候,通知實現(xiàn)了ApplicationListener的ServiceBean類進行回調(diào)onApplicationEvent 事件方法秘案,dubbo會在這個方法中調(diào)用ServiceBean父類ServiceConfig的export方法砰苍,而該方法真正實現(xiàn)了服務(wù)的(異步或者非異步)發(fā)布。

https://blog.csdn.net/yanpenglei/article/details/80261762

2阱高、export的步驟簡介

首先會檢查各種配置信息赚导,填充各種屬性,總之就是保證我在開始暴露服務(wù)之前赤惊,所有的東西都準(zhǔn)備好了吼旧,并且是正確的。

加載所有的注冊中心荐捻,因為我們暴露服務(wù)需要注冊到注冊中心中去黍少。

根據(jù)配置的所有協(xié)議和注冊中心url分別進行導(dǎo)出。

5.png

導(dǎo)出的具體操作:

1处面、loadRegistries方法構(gòu)造url的列表

2厂置、url的對象存儲的是注冊中心的消息,包括注冊中心的host地址魂角,協(xié)議昵济,application,類型(常用的是zk)等信息

3、循環(huán)列表访忿,調(diào)用doExportUrlsFor1Protocol方法將同一種協(xié)議發(fā)布到每一個注冊中心上

4瞧栗、doExportUrlsFor1Protocol方法:

1)、InetAddress.getLocalHost().getHostAddress()

2)海铆、獲取port等信息迹恐,沒有配置則獲取隨機可用端口

3)、將application卧斟,side殴边,method等參數(shù)解析到一個map里,application通過ApplicationConfig對象解析獲得珍语,method通過反射獲得

4)锤岸、將host,port板乙,map等信息構(gòu)造成一個url對象

5)是偷、如果配置的不是remote,則做本地導(dǎo)出募逞。如果配置的不是local蛋铆,則暴露為遠(yuǎn)程服務(wù)。

6)凡辱、proxyFactory構(gòu)造Invoker

7)戒职、獲取完Invoker之后,轉(zhuǎn)換成對外的Exporter透乾,緩存起來洪燥。

所有的provider都被解析成ServiceBean。ServiceBean實現(xiàn)了InitializingBean接口乳乌,繼承了ServiceConfig類捧韵。在afterProperties方法中對注冊中心等進行配置,配置完成后調(diào)用了export方法汉操,export方法中設(shè)置了延遲發(fā)布等配置再来,最后最核心的邏輯是調(diào)用doExport方法,將ip磷瘤,端口芒篷,方法,類名等拼成url暴露給注冊中心解析采缚。針對每一個注冊中心针炉,分別組裝url,進入RegistoryProtocol類的export方法扳抽,打開一個netty Server偵聽服務(wù)篡帕,并接受客戶端的各種請求殖侵,向注冊中心暴露服務(wù)。

doExport方法的核心邏輯镰烧,校驗application拢军,校驗注冊中心等,最后調(diào)用doExportUrls怔鳖。doExportUrls方法的邏輯是將同一種協(xié)議發(fā)布到不同的注冊中心上茉唉。發(fā)布的方法是doExportUrlsFor1Protocol。

doExportUrlsFor1Protocol步驟:獲取provider的host败砂,

服務(wù)的提供者和消費者之間的調(diào)用是不經(jīng)過注冊中心的赌渣,而是直接的調(diào)用,因此消費者也可以直接在配置中指定提供者的ip地址昌犹。

消費者調(diào)用過程:RegistryProtocol對象的refer()方法,根據(jù)url和服務(wù)接口構(gòu)造出invoker對象览芳,

八斜姥、數(shù)據(jù)庫

1、數(shù)據(jù)庫的范式

1沧竟、第一范式:每一個字段保證原子性

2铸敏、第二范式:表字段與主鍵有依賴關(guān)系

3、第三范式:表字段與主鍵的依賴要求直接依賴

2悟泵、數(shù)據(jù)庫索引為什么用樹

3杈笔、索引使用B+樹的好處,索引的原理

主鍵是唯一的聚集索引糕非,覆蓋了真實的數(shù)據(jù)蒙具,對其它字段加索引都是非聚集索引,非聚集索引是先找到主鍵朽肥,再通過主鍵查詢數(shù)據(jù)禁筏。如果兩個字段組成一個聯(lián)合索引,那么以一個字段為條件查詢另一個字段就不需要經(jīng)過表衡招,查詢效率也會很高

B+樹:每一個節(jié)點的葉子上限是2d篱昔。只有葉節(jié)點存儲data。

https://www.cnblogs.com/wuchanming/p/6886020.html

mysql聯(lián)合索引的最左前綴機制

http://www.reibang.com/p/e1dce41a6b2b

4始腾、數(shù)據(jù)庫樂觀鎖悲觀鎖

https://blog.csdn.net/xiaokang123456kao/article/details/75268240

5州刽、聚集索引和非聚集索引的區(qū)別

聚集索引,葉子為數(shù)據(jù)浪箭。非聚集索引穗椅,葉子為聚集索引

聚集索引物理順序?qū)?yīng)表數(shù)據(jù)的邏輯順序。非聚集不是

6山林、索引失效

1房待、索引存儲null值邢羔。或使用is null桑孩,會觸發(fā)全表掃描

2拜鹤、重復(fù)數(shù)據(jù)較多的列

3、模糊查詢'%xxx%'

4流椒、sql語句中有or或者not

7敏簿、 臟讀:事務(wù)A讀到了事務(wù)B未提交的數(shù)據(jù)

不可重復(fù)讀:事務(wù)A兩次查詢某一列的間隙,事務(wù)B對列進行了修改

幻讀:事務(wù)A先搜到了N條宣虾,事務(wù)B又加了M條惯裕,事務(wù)A第二次查詢時條數(shù)增加

九、設(shè)計模式

1绣硝、熟悉的設(shè)計模式

策略蜻势,責(zé)任鏈,builder鹉胖,工廠握玛,適配器,觀察者甫菠,模板方法挠铲,裝飾器,代理寂诱,

創(chuàng)建型:工廠拂苹,抽象工廠,單例痰洒,建造者瓢棒,原型

結(jié)構(gòu)型:適配器,裝飾器带迟,代理音羞,外觀,橋接仓犬,組合嗅绰,享元

行為型:策略,模板方法搀继,責(zé)任鏈窘面,觀察者,迭代子模式叽躯,命令财边,狀態(tài),備忘錄点骑,訪問者酣难,

十谍夭、分布式,高并發(fā)架構(gòu)類

1憨募、項目中如何解決高并發(fā)的問題

1紧索、在高頻率讀的數(shù)據(jù)加入緩存

2、注意并發(fā)的安全問題菜谣,在需要的地方使用同步容器或加鎖

3珠漂、加機器

4、避免循環(huán)查庫等消耗性能的操作

2尾膊、分布式環(huán)境下如何保證訂單號唯一

服務(wù)唯一編碼+時間戳+oracle自增序列

3媳危、微服務(wù)和SOA

4、分布式緩存的一致性hash

https://www.cnblogs.com/akaneblog/p/6736386.html

5冈敛、分布式系統(tǒng)間的事務(wù)一致性

CAP待笑,一致性,可用性抓谴,分區(qū)容忍性滋觉,不可兼得。分區(qū)容忍性是必須的齐邦,因此各類分布式中間件和框架,要么選擇弱化C第租,要么選擇弱化A措拇。

分布式事務(wù)算法:

1、2PC/3PC 兩階段提交或三階段提交慎宾。涉及到跨庫事務(wù)丐吓,每一個節(jié)點只能保證,也只能知道自己節(jié)點的成功與失敗趟据,無法知道其他節(jié)點券犁。因此引入一個協(xié)調(diào)者,或者叫參與者來掌控所有節(jié)點的操作結(jié)果并決定是否將事務(wù)提交汹碱。

第一階段:協(xié)調(diào)者問所有節(jié)點是否可以提交粘衬,各個節(jié)點自我檢查后回應(yīng)可以提交或者不可以

第二階段:所有的節(jié)點都回應(yīng)了可提交,那么協(xié)調(diào)者向所有參與者發(fā)送正式提交的命令咳促。如果有一個節(jié)點回應(yīng)不可提交稚新,那么協(xié)調(diào)者向所有參與者發(fā)送回滾請求。

兩段提交的最大問題跪腹,就是參與者如果沒有收到?jīng)Q策褂删,那么就會一直處于阻塞狀態(tài)。因此三段提交將提交修改為:詢問的時候不鎖資源冲茸,等到正式提交命令下達時再鎖資源

2屯阀、TCC

十一缅帘、Redis

1、redis線程模型

https://www.cnblogs.com/barrywxx/p/8570821.html

2难衰、redis的持久化機制

RDB钦无,AOF

3、mysql主從復(fù)制和redis主從復(fù)制的區(qū)別

4召衔、redis數(shù)據(jù)持久化 https://www.cnblogs.com/chenliangcl/p/7240350.html

5铃诬、redis緩存失效策略:

1、定時器 set值的時候就設(shè)置一個定時器

2苍凛、惰性 get的時候再判斷

3趣席、定期回收

6、redis數(shù)據(jù)淘汰策略:

數(shù)據(jù)集到一定大小醇蝴,就需要實行數(shù)據(jù)淘汰策略

redis 提供 6種數(shù)據(jù)淘汰策略:

volatile-lru:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰

volatile-ttl:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰

volatile-random:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰

allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰

allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰

no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)

7宣肚、redis選舉機制:

哨兵機制:啟動多個哨兵對集群進行監(jiān)控。發(fā)現(xiàn)異常就報告給管理員悠栓,或自動進行故障遷移霉涨。將失效的Master的其中一個Salve選舉為新的Master。

從主服務(wù)器的從服務(wù)器中選出一個從服務(wù)器作為新的主服務(wù)器惭适。選點的依據(jù)依次是:網(wǎng)絡(luò)連接正常->5秒內(nèi)回復(fù)過INFO命令->10*down-after-milliseconds內(nèi)與主連接過的->從服務(wù)器優(yōu)先級->復(fù)制偏移量->運行id較小的笙瑟。選出之后通過slaveif no ont將該從服務(wù)器升為新主服務(wù)器

當(dāng)主服務(wù)器宕機之后,從服務(wù)器切換成主服務(wù)器的時間內(nèi)癞志,服務(wù)是不可用的

十二往枷、MQ

1、MQ重復(fù)消費

業(yè)務(wù)上冪等

2凄杯、mq重發(fā)機制错洁,nameServer掛了之后還能不能接著發(fā)消息

3、

十三戒突、網(wǎng)絡(luò)類

1屯碴、TCP和UDP的區(qū)別

2、HTTP協(xié)議

十四膊存、算法导而,數(shù)據(jù)結(jié)構(gòu)

1、鏈表反轉(zhuǎn)

1.就地反轉(zhuǎn)法 public ListNode reverseList1(ListNode head) { if (head == null) return head; ListNode dummy = new ListNode(-1); dummy.next = head; ListNode prev = dummy.next; ListNode pCur = prev.next; while (pCur != null) { prev.next = pCur.next; pCur.next = dummy.next; dummy.next = pCur; pCur = prev.next; } return dummy.next; }

2膝舅、N個數(shù)字找K個最大值

1嗡载、小頂堆 時間復(fù)雜度O(NlogK)

2、分成很多份仍稀,每份再做小頂堆或者直接快排洼滚,可以發(fā)揮多核優(yōu)勢

3、bitmap去重

3技潘、動態(tài)規(guī)劃 https://blog.csdn.net/rock_joker/article/details/68928150

4遥巴、快排千康,紅黑樹

十五、Linux

1铲掐、linux常用命令 https://www.cnblogs.com/irisrain/p/4346086.html

◆ 安裝和登錄命令:login拾弃、shutdown關(guān)閉計算機、halt 等于就是shutdown -h關(guān)機后關(guān)電源摆霉、reboot重啟豪椿、install、mount携栋、umount搭盾、chsh更改shell設(shè)定、exit退出系統(tǒng)婉支、last顯示近期用戶的登錄狀況鸯隅;

◆ 文件處理命令:file判斷文件類型、mkdir向挖、grep蝌以、dd復(fù)制文件、find目錄中搜索文件何之、mv移動文件跟畅,也可以用來重命名、ls溶推、diff兩個文件之間的比較碍彭、cat、ln文件之間創(chuàng)建連接悼潭;

◆ 系統(tǒng)管理相關(guān)命令:df檢查文件系統(tǒng)的磁盤占用、top顯示執(zhí)行中的文件進程舞箍、free顯示內(nèi)存占用比例舰褪、quota、at疏橄、lp打印文件占拍、adduser、groupadd將新組加入系統(tǒng)捎迫、kill晃酒、crontab;

◆ 網(wǎng)絡(luò)操作命令:ifconfig查看和更改ip地址廣播地址等窄绒、ip -s輸出狀態(tài) -f接協(xié)議種類 贝次、ping -c設(shè)置完成要求回應(yīng)的次數(shù) -R記錄路由過程 、netstat 查看自身網(wǎng)絡(luò)情況 彰导、telnet 連接遠(yuǎn)程端口蛔翅、ftp遠(yuǎn)程文件傳輸敲茄、route -add 增加路由、rlogin山析、rcp遠(yuǎn)程文件拷貝 -r遞歸拷貝目錄 堰燎、finger查詢登陸賬號的信息 -s -l、mail笋轨、 nslookup秆剪;scp scp file_path_1 root@192.168.1.1:file_path_2 遠(yuǎn)程file2拷貝到本地file1

◆ 系統(tǒng)安全相關(guān)命令:passwd、su爵政、umask仅讽、chgrp、chmod茂卦、chown何什、chattr、sudo ps等龙、who处渣;

◆ 其它命令:tar、unzip蛛砰、gunzip罐栈、unarj、mtools泥畅、man荠诬、unendcode、uudecode

十六位仁、NIO

https://blog.csdn.net/chen8238065/article/details/48315085#%E7%9B%B8%E5%85%B3%E8%B5%84%E6%96%99

https://segmentfault.com/a/1190000003063859

https://blog.csdn.net/u014507083/article/details/73784898

十七柑贞、操作系統(tǒng)

1、死鎖發(fā)生的條件和解決方案

死鎖產(chǎn)生的條件:

1聂抢、互斥條件:資源不能被共享钧嘶,只能由一個進程使用

2、請求與保持條件:進程已獲得了一些資源琳疏,但因請求其它資源被阻塞時有决,對已獲得的資源保持不放。

3空盼、不可搶占條件(No pre-emption) :有些系統(tǒng)資源是不可搶占的书幕,當(dāng)某個進程已獲得這種資源后,系統(tǒng)不能強行收回揽趾,只能由進程使用完時自己釋放台汇。

4、循環(huán)等待條件(Circular wait) :若干個進程形成環(huán)形鏈,每個都占用對方申請的下一個資源励七。

處理死鎖的方法:

1智袭、鴕鳥算法:

2、銀行家算法:

對待死鎖的策略主要有:

(1) 死鎖預(yù)防:破壞導(dǎo)致死鎖必要條件中的任意一個就可以預(yù)防死鎖掠抬。例如吼野,要求用戶申請資源時一次性申請所需要的全部資源,這就破壞了保持和等待條件两波;將資源分層瞳步,得到上一層資源后,才能夠申請下一層資源腰奋,它破壞了環(huán)路等待條件单起。預(yù)防通常會降低系統(tǒng)的效率。

(2) 死鎖避免:避免是指進程在每次申請資源時判斷這些操作是否安全劣坊,例如嘀倒,使用銀行家算法。死鎖避免算法的執(zhí)行會增加系統(tǒng)的開銷局冰。

(3) 死鎖檢測:死鎖預(yù)防和避免都是事前措施测蘑,而死鎖的檢測則是判斷系統(tǒng)是否處于死鎖狀態(tài),如果是康二,則執(zhí)行死鎖解除策略碳胳。

(4) 死鎖解除:這是與死鎖檢測結(jié)合使用的,它使用的方式就是剝奪沫勿。即將某進程所擁有的資源強行收回挨约,分配給其他的進程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末产雹,一起剝皮案震驚了整個濱河市诫惭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蔓挖,老刑警劉巖贝攒,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異时甚,居然都是意外死亡,警方通過查閱死者的電腦和手機哈踱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門荒适,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人开镣,你說我怎么就攤上這事刀诬。” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵陕壹,是天一觀的道長质欲。 經(jīng)常有香客問我,道長糠馆,這世上最難降的妖魔是什么嘶伟? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮又碌,結(jié)果婚禮上九昧,老公的妹妹穿的比我還像新娘。我一直安慰自己毕匀,他們只是感情好铸鹰,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著皂岔,像睡著了一般蹋笼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躁垛,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天剖毯,我揣著相機與錄音,去河邊找鬼缤苫。 笑死速兔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的活玲。 我是一名探鬼主播涣狗,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼舒憾!你這毒婦竟也來了镀钓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤镀迂,失蹤者是張志新(化名)和其女友劉穎丁溅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體探遵,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡窟赏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了箱季。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涯穷。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖藏雏,靈堂內(nèi)的尸體忽然破棺而出拷况,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布赚瘦,位于F島的核電站粟誓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏起意。R本人自食惡果不足惜鹰服,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杜恰。 院中可真熱鬧获诈,春花似錦、人聲如沸心褐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逗爹。三九已至亡嫌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掘而,已是汗流浹背挟冠。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袍睡,地道東北人知染。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像斑胜,于是被迫代替她去往敵國和親控淡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354