大家好,如果您還對(duì)mysql隔離級(jí)別面試不太了解,沒有關(guān)系,今天就由本站為大家分享mysql隔離級(jí)別面試的知識(shí),包括innodb事務(wù)隔離級(jí)別的問題都會(huì)給大家分析到,還望可以解決大家的問題,下面我們就開始吧!
怎么理解SQL的四個(gè)事務(wù)隔離級(jí)別
你好,我是小黃,這個(gè)題目我來回答下。
事務(wù)的隔離級(jí)別是為了解決并發(fā)問題。那么先來了解下并發(fā)帶來的問題:
1)丟失更新LostUpdate:(沒有加鎖)
兩個(gè)事務(wù)同時(shí)更新一行數(shù)據(jù),最后一個(gè)事務(wù)的更新會(huì)覆蓋掉第一個(gè)事務(wù)的更新,從而導(dǎo)致第一個(gè)事務(wù)更新的數(shù)據(jù)丟失,這是由于沒有加鎖造成的。
2)臟讀DirtyReads:(沒有隔離)
一個(gè)事務(wù)看到了另外一個(gè)事物沒有提交的更新數(shù)據(jù)。這是事務(wù)沒有隔離造成的。
3)不可重復(fù)讀:Non-RepeatableReads
在同一事務(wù)中,多次讀取同一數(shù)據(jù)但是返回不同的結(jié)果,也就是有其他事務(wù)更改了這些數(shù)據(jù)。
4)幻讀:PhantomReads并發(fā)造成的
一個(gè)事務(wù)在執(zhí)行過程中讀取到另一個(gè)事務(wù)已提交的插入數(shù)據(jù)。就是說在第一個(gè)事務(wù)開始時(shí),讀取到一批數(shù)據(jù),但是伺候另一個(gè)事務(wù)又插入新數(shù)據(jù)并提交,此時(shí)第一個(gè)事務(wù)又讀取到這批數(shù)據(jù)但是發(fā)現(xiàn)多出了一條,貌似產(chǎn)生幻覺一樣。這是并發(fā)造成的。
接下來我們說說這四個(gè)隔離級(jí)別,
1)未提交讀(ReadUncommitted):一個(gè)事務(wù)能夠讀取到別的事務(wù)中沒有提交的更新數(shù)據(jù)。事務(wù)可以讀取到未提交的數(shù)據(jù),這也被稱為臟讀(dirtyread)。
所以這種級(jí)別很有可能讀到臟數(shù)據(jù),隔離級(jí)別最低。
2)提交讀(ReadCommitted):一個(gè)事務(wù)只能讀取到別的事務(wù)提交的更新數(shù)據(jù)。
一般我們提交讀就可以了。只能讀取到已經(jīng)提交的數(shù)據(jù)。即解決了臟讀,但未解決不可重復(fù)讀。(oracle默認(rèn)的)
3)可重復(fù)讀(RepeatedRead):保證同一事務(wù)中先后執(zhí)行的多次查詢將返回同意結(jié)果,不受其他事務(wù)的影響。這種隔離級(jí)別可能出現(xiàn)幻讀。(mysql默認(rèn)的)
4)序列化(Serializable):不允許事務(wù)并發(fā)執(zhí)行,強(qiáng)制事務(wù)串行執(zhí)行,就是在讀取的每一行數(shù)據(jù)上都加上了鎖,讀寫相互都會(huì)阻塞。這種隔離級(jí)別最高,是最安全的,性能最低,不會(huì)出現(xiàn)臟讀,不可重復(fù)讀,幻讀,丟失更新。
那么怎么設(shè)置隔離級(jí)別呢
SETTRANSACTIONISOLATIONLEVELREADCOMMITTED;//設(shè)置提交讀隔離級(jí)別
SETTRANSACTIONISOLATIONLEVELSERIALIZABLE;//設(shè)置序列化隔離級(jí)別
以上請(qǐng)參考。
若有疑問,歡迎留言評(píng)論,謝謝。
sql優(yōu)化面試題及答案
1、Mysql查詢是否區(qū)分大小寫?
不區(qū)分SELECTVERSION(),CURRENT_DATE;SeLectversion(),current_date;seleCtvErSiOn(),current_DATE;所有這些例子都是一樣的,Mysql不區(qū)分大小寫。
2、Mysql的技術(shù)特點(diǎn)是什么?
Mysql數(shù)據(jù)庫軟件是一個(gè)客戶端或服務(wù)器系統(tǒng),其中包括:支持各種客戶端程序和庫的多線程SQL服務(wù)器、不同的后端、廣泛的應(yīng)用程序編程接口和管理工具。
3、Heap表是什么?
HEAP表存在于內(nèi)存中,用于臨時(shí)高速存儲(chǔ)。BLOB或TEXT字段是不允許的只能使用比較運(yùn)算符=,<,>,=>,=<HEAP表不支持AUTO_INCREMENT索引不可為NULL
4、Mysql服務(wù)器默認(rèn)端口是什么?
Mysql服務(wù)器的默認(rèn)端口是3306。
5、與Oracle相比,Mysql有什么優(yōu)勢(shì)?
Mysql是開源軟件,隨時(shí)可用,無需付費(fèi)。Mysql是便攜式的帶有命令提示符的GUI。使用Mysql查詢?yōu)g覽器支持管理
6、如何區(qū)分FLOAT和DOUBLE?
以下是FLOAT和DOUBLE的區(qū)別:浮點(diǎn)數(shù)以8位精度存儲(chǔ)在FLOAT中,并且有四個(gè)字節(jié)。浮點(diǎn)數(shù)存儲(chǔ)在DOUBLE中,精度為18位,有八個(gè)字節(jié)。
7、區(qū)分CHAR_LENGTH和LENGTH?
CHAR_LENGTH是字符數(shù),而LENGTH是字節(jié)數(shù)。Latin字符的這兩個(gè)數(shù)據(jù)是相同的,但是對(duì)于Unicode和其他編碼,它們是不同的。
8、請(qǐng)簡(jiǎn)潔描述Mysql中InnoDB支持的四種事務(wù)隔離級(jí)別名稱,以及逐級(jí)之間的區(qū)別?
SQL標(biāo)準(zhǔn)定義的四個(gè)隔離級(jí)別為:readuncommited:讀到未提交數(shù)據(jù)readcommitted:臟讀,不可重復(fù)讀repeatableread:可重讀serializable:串行事物
9、在Mysql中ENUM的用法是什么?
ENUM是一個(gè)字符串對(duì)象,用于指定一組預(yù)定義的值,并可在創(chuàng)建表時(shí)使用。Createtablesize(nameENUM('Smail,‘Medium’,‘Large’);
10、如何定義REGEXP?
REGEXP是模式匹配,其中匹配模式在搜索值的任何位置。
你遇到過哪些質(zhì)量很高的Java面試
筆者曾就職與華為,騰訊,samsung,是一個(gè)資深碼農(nóng)
如果大家想了解更多程序員的生活或者Java與android技術(shù)可以關(guān)注我哦1.java基礎(chǔ)以及多個(gè)“比較”
1.Collections.sort排序內(nèi)部原理
在Java6中Arrays.sort()和Collections.sort()使用的是MergeSort,而在Java7中,內(nèi)部實(shí)現(xiàn)換成了TimSort,其對(duì)對(duì)象間比較的實(shí)現(xiàn)要求更加嚴(yán)格
2.hashMap原理,java8做的改變
從結(jié)構(gòu)實(shí)現(xiàn)來講,HashMap是數(shù)組+鏈表+紅黑樹(JDK1.8增加了紅黑樹部分)實(shí)現(xiàn)的。HashMap最多只允許一條記錄的鍵為null,允許多條記錄的值為null。HashMap非線程安全。ConcurrentHashMap線程安全。解決碰撞:當(dāng)出現(xiàn)沖突時(shí),運(yùn)用拉鏈法,將關(guān)鍵詞為同義詞的結(jié)點(diǎn)鏈接在一個(gè)單鏈表中,散列表長m,則定義一個(gè)由m個(gè)頭指針組成的指針數(shù)組T,地址為i的結(jié)點(diǎn)插入以T(i)為頭指針的單鏈表中。Java8中,沖突的元素超過限制(8),用紅黑樹替換鏈表。
3.String和StringBuilder的區(qū)別
1)可變與不可變:String不可變,每一次執(zhí)行“+”都會(huì)新生成一個(gè)新對(duì)象,所以頻繁改變字符串的情況中不用String,以節(jié)省內(nèi)存。
2)是否多線程安全:StringBuilder并沒有對(duì)方法進(jìn)行加同步鎖,所以是非線程安全的。StringBuffer和String均線程安全。
4.Vector與Array的區(qū)別
1)ArrayList在內(nèi)存不夠時(shí)默認(rèn)是擴(kuò)展50%+1個(gè),Vector是默認(rèn)擴(kuò)展1倍。2)Vector屬于線程安全級(jí)別的,但是大多數(shù)情況下不使用Vector,因?yàn)榫€程安全需要更大的系統(tǒng)開銷。
5.HashMap與Hashtable的區(qū)別
1)歷史原因:Hashtable繼承Dictonary類,HashMap繼承自abstractMap
2)HashMap允許空的鍵值對(duì),但最多只有一個(gè)空對(duì)象,而HashTable不允許。3)HashTable同步,而HashMap非同步,效率上比HashTable要高
6.ConncurrentHashMap和hashtable比較
兩個(gè)線程并發(fā)訪問map中同一條鏈,一個(gè)線程在尾部刪除,一個(gè)線程在前面遍歷查找,問為什么前面的線程還能正確的查找到后面被另一個(gè)線程刪除的節(jié)點(diǎn))
ConcurrentHashMap融合了hashtable和hashmap二者的優(yōu)勢(shì)。hashtable是做了同步的,即線程安全,hashmap未考慮同步。所以hashmap在單線程情況下效率較高。hashtable在的多線程情況下,同步操作能保證程序執(zhí)行的正確性。但是hashtable是阻塞的,每次同步執(zhí)行的時(shí)候都要鎖住整個(gè)結(jié)構(gòu),ConcurrentHashMap正是為了解決這個(gè)問題而誕生的,
ConcurrentHashMap允許多個(gè)修改操作并發(fā)進(jìn)行,其關(guān)鍵在于使用了鎖分離技術(shù)(一個(gè)Array保存多個(gè)Object,使用這些對(duì)象的鎖作為分離鎖,get/put時(shí)隨機(jī)使用任意一個(gè))。它使用了多個(gè)鎖來控制對(duì)hash表的不同部分進(jìn)行的修改。在JDK1.6中,有HashEntry結(jié)構(gòu)存在,每次插入將新添加節(jié)點(diǎn)作為鏈的頭節(jié)點(diǎn)(同HashMap實(shí)現(xiàn)),而且每次刪除一個(gè)節(jié)點(diǎn)時(shí),會(huì)將刪除節(jié)點(diǎn)之前的所有節(jié)點(diǎn)拷貝一份組成一個(gè)新的鏈,而將當(dāng)前節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn)的next指向當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),從而在刪除以后有兩條鏈存在,因而可以保證即使在同一條鏈中,有一個(gè)線程在刪除,而另一個(gè)線程在遍歷,它們都能工作良好,因?yàn)楸闅v的線程能繼續(xù)使用原有的鏈。
Java8中,采用volatileHashEntry保存數(shù)據(jù),table元素作為鎖;從table數(shù)組+單向鏈表加上了紅黑樹。紅黑樹是一種特別的二叉查找樹,特性為:1.節(jié)點(diǎn)為紅或者黑2.根節(jié)點(diǎn)為黑3.葉節(jié)點(diǎn)為黑4.一節(jié)點(diǎn)為紅,則葉節(jié)點(diǎn)為黑5.一節(jié)點(diǎn)到其子孫節(jié)點(diǎn)所有路徑上的黑節(jié)點(diǎn)數(shù)目相同。
7.ArrayList與LinkedList的區(qū)別?
最明顯的區(qū)別是ArrrayList底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組,支持隨機(jī)訪問,而LinkedList的底層數(shù)據(jù)結(jié)構(gòu)書鏈表,不支持隨機(jī)訪問。使用下標(biāo)訪問一個(gè)元素,ArrayList的時(shí)間復(fù)雜度是O(1),而LinkedList是O(n)。LinkedList是雙向鏈表
8.Java中,Comparator與Comparable有什么不同?
Comparable接口用于定義對(duì)象的自然順序,是排序接口,而comparator通常用于定義用戶定制的順序,是比較接口。我們?nèi)绻枰刂颇硞€(gè)類的次序,而該類本身不支持排序(即沒有實(shí)現(xiàn)Comparable接口),那么我們就可以建立一個(gè)“該類的比較器”來進(jìn)行排序。Comparable總是只有一個(gè),但是可以有多個(gè)comparator來定義對(duì)象的順序。
9.抽象類是什么?它與接口有什么區(qū)別?你為什么要使用過抽象類?
抽象類是指不允許被實(shí)例化的類;一個(gè)類只能使用一次繼承關(guān)系。但是,一個(gè)類卻可以實(shí)現(xiàn)多個(gè)interface。
abstractclass和interface所反映出的設(shè)計(jì)理念不同。其實(shí)abstractclass表示的是"is-a"關(guān)系,interface表示的是"like-a"關(guān)系
實(shí)現(xiàn)抽象類和接口的類必須實(shí)現(xiàn)其中的所有方法。抽象類中可以有非抽象方法。接口中則不能有實(shí)現(xiàn)方法。但在Java8中允許接口中有靜態(tài)默認(rèn)的方法。
用抽象類是為了重用。減少編碼量,降低耦合性。
10.描述Java中的重載和重寫?
重載和重寫都允許你用相同的名稱來實(shí)現(xiàn)不同的功能,但是重載是編譯時(shí)活動(dòng),而重寫是運(yùn)行時(shí)活動(dòng)。你可以在同一個(gè)類中重載方法,但是只能在子類中重寫方法。重寫必須要有繼承
重寫:1、在子類中可以根據(jù)需要對(duì)從基類中繼承來的方法進(jìn)行重寫。2、重寫的方法和被重寫的方法必須具有相同方法名稱、參數(shù)列表和返回類型。3、重寫方法不能使用比被重寫的方法更嚴(yán)格的訪問權(quán)限。
重載的時(shí)候,方法名要一樣,但是參數(shù)類型和個(gè)數(shù)不一樣,返回值類型可以相同也可以不相同。無法以返回型別作為重載函數(shù)的區(qū)分標(biāo)準(zhǔn)。
11.Collection與Collections的區(qū)別是什么?
Collection<E>是Java集合框架中的基本接口;
Collections是Java集合框架提供的一個(gè)工具類,其中包含了大量用于操作或返回集合的靜態(tài)方法。
12.Java中多態(tài)的實(shí)現(xiàn)原理
所謂多態(tài),指的就是父類引用指向子類對(duì)象,調(diào)用方法時(shí)會(huì)調(diào)用子類的實(shí)現(xiàn)而不是父類的實(shí)現(xiàn)。多態(tài)的實(shí)現(xiàn)的關(guān)鍵在于“動(dòng)態(tài)綁定”。
13.object中定義了哪些方法?
clone(),equals(),hashCode(),toString(),notify(),notifyAll(),wait(),finalize(),getClass()
14.Java泛型和類型擦除
泛型即參數(shù)化類型,在創(chuàng)建集合時(shí),指定集合元素的類型,此集合只能傳入該類型的參數(shù)。類型擦除:java編譯器生成的字節(jié)碼不包含泛型信息,所以在編譯時(shí)擦除:1.泛型用最頂級(jí)父類替換;2.移除。
15.說出5個(gè)JDK1.8引入的新特性?
Java8在Java歷史上是一個(gè)開創(chuàng)新的版本,下面JDK8中5個(gè)主要的特性:Lambda表達(dá)式;允許像對(duì)象一樣傳遞匿名函數(shù)StreamAPI,充分利用現(xiàn)代多核CPU,可以寫出很簡(jiǎn)潔的代碼;Date與TimeAPI,最終,有一個(gè)穩(wěn)定、簡(jiǎn)單的日期和時(shí)間庫可供你使用擴(kuò)展方法,現(xiàn)在,接口中可以有靜態(tài)、默認(rèn)方法;重復(fù)注解,現(xiàn)在你可以將相同的注解在同一類型上使用多次。
16.java中public,private,protected以及默認(rèn)關(guān)鍵字的訪問范圍:
Protected可在包內(nèi)及包外子類訪問,default只能同一包內(nèi)訪問,prvate只能同一類
17.常用數(shù)據(jù)結(jié)構(gòu):
集合,線性結(jié)構(gòu)(數(shù)組,隊(duì)列,鏈表和棧),樹形結(jié)構(gòu),圖狀結(jié)構(gòu)
18.Java中的TreeMap是采用什么樹實(shí)現(xiàn)的?(答案)
Java中的TreeMap是使用紅黑樹實(shí)現(xiàn)的。
19.匿名內(nèi)部類是什么?如何訪問在其外面定義的變量?
匿名內(nèi)部類也就是沒有名字的內(nèi)部類,匿名內(nèi)部類只能使用一次,它通常用來簡(jiǎn)化代碼編寫。
匿名內(nèi)部類只能訪問外部類的Final變量.Java8更加智能:如果局部變量被匿名內(nèi)部類訪問,那么該局部變量相當(dāng)于自動(dòng)使用了final修飾。
20.如何創(chuàng)建單例模式?說了雙重檢查,他說不是線程安全的。如何高效的創(chuàng)建一個(gè)線程安全的單例?
一種是通過枚舉,一種是通過靜態(tài)內(nèi)部類。
21.poll()方法和remove()方法的區(qū)別?
poll()和remove()都是從隊(duì)列中取出一個(gè)元素,但是poll()在獲取元素失敗的時(shí)候會(huì)返回空,但是remove()失敗的時(shí)候會(huì)拋出異常。
22.寫一段代碼在遍歷ArrayList時(shí)移除一個(gè)元素
使用迭代器。
Iteratoritr=list.iterator();while(itr.hasNext()){if(...){itr.remove();}}
2.JVM
1.JVM如何加載一個(gè)類的過程,雙親委派模型中有哪些方法
類加載過程:加載、驗(yàn)證(驗(yàn)證階段作用是保證Class文件的字節(jié)流包含的信息符合JVM規(guī)范,不會(huì)給JVM造成危害)、準(zhǔn)備(準(zhǔn)備階段為變量分配內(nèi)存并設(shè)置類變量的初始化)、解析(解析過程是將常量池內(nèi)的符號(hào)引用替換成直接引用)、初始化。
雙親委派模型中方法:雙親委派是指如果一個(gè)類收到了類加載的請(qǐng)求,不會(huì)自己先嘗試加載,先找父類加載器去完成。當(dāng)頂層啟動(dòng)類加載器表示無法加載這個(gè)類的時(shí)候,子類才會(huì)嘗試自己去加載。當(dāng)回到最開的發(fā)起者加載器還無法加載時(shí),并不會(huì)向下找,而是拋出ClassNotFound異常。
方法:?jiǎn)?dòng)(Bootstrap)類加載器,標(biāo)準(zhǔn)擴(kuò)展(Extension)類加載器,應(yīng)用程序類加載器(Application),上下文(Custom)類加載器。意義是防止內(nèi)存中出現(xiàn)多份同樣的字節(jié)碼。
2.GC算法(什么樣的對(duì)象算是可回收對(duì)象,可達(dá)性分析),CMS收集器
jvm是如何判斷一個(gè)對(duì)象已經(jīng)變成了可回收的“垃圾”,一般是兩個(gè)方法:引用記數(shù)法和根搜索算法。引用記數(shù)法沒辦法解決循環(huán)引用的問題,所以用根搜索。從一系列的”GCRoots“對(duì)象開始向下搜索,搜索走過的路徑稱為引用鏈。當(dāng)一個(gè)對(duì)象到”GCRoots“之間沒有引用鏈時(shí),被稱為引用不可達(dá)。引用不可到的對(duì)象被認(rèn)為是可回收的對(duì)象。
3.JVM分為哪些區(qū),每一個(gè)區(qū)干嗎的?
1)方法區(qū)(method):被所有的線程共享。方法區(qū)包含所有的類信息和靜態(tài)變量。
2)堆(heap):被所有的線程共享,存放對(duì)象實(shí)例以及數(shù)組,Java堆是GC的主要區(qū)域。
3)棧(stack):每個(gè)線程包含一個(gè)棧區(qū),棧中保存一些局部變量等。
4)程序計(jì)數(shù)器:是當(dāng)前線程執(zhí)行的字節(jié)碼的行指示器。
4.JVM新生代,老年代,持久代,都存儲(chǔ)哪些東西?
持久代主要存放的是Java類的類信息,與垃圾收集要收集的Java對(duì)象關(guān)系不大。所有新生成的對(duì)象首先都是放在年輕代的,年老代中存放的都是一些生命周期較長的對(duì)象。
5.內(nèi)存溢出和內(nèi)存泄漏:
內(nèi)存溢出:程序申請(qǐng)內(nèi)存時(shí),沒有足夠的內(nèi)存,outofmemory;內(nèi)存泄漏值垃圾對(duì)象無法回收,可以使用memoryanalyzer工具查看泄漏。
6.進(jìn)程與線程:
進(jìn)程值運(yùn)行中的程序(獨(dú)立性,動(dòng)態(tài)性,并發(fā)性),線程指進(jìn)程中的順序執(zhí)行流。區(qū)別是:1.進(jìn)程間不共享內(nèi)存2.創(chuàng)建進(jìn)程進(jìn)行資源分配的代價(jià)要大得多,所以多線程在高并發(fā)環(huán)境中效率高。
7.序列化與反序列化:
序列化指將java對(duì)象轉(zhuǎn)化為字節(jié)序列,反序列化相反。主要是為了java線程間通訊,實(shí)現(xiàn)對(duì)象傳遞。只有實(shí)現(xiàn)了Serializable或Externalizable接口類對(duì)象才可被序列化。
8.64位JVM中,int的長度是多數(shù)?
Java中,int類型變量的長度是一個(gè)固定值,與平臺(tái)無關(guān),都是32位。意思就是說,在32位和64位的Java虛擬機(jī)中,int類型的長度是相同的。
9.Java中WeakReference與SoftReference的區(qū)別?
Java中一共有四種類型的引用。StrongReference、SoftReference、WeakReference以及PhantomReference。
StrongReference是Java的默認(rèn)引用實(shí)現(xiàn),它會(huì)盡可能長時(shí)間的存活于JVM內(nèi),當(dāng)沒有任何對(duì)象指向它時(shí)將會(huì)被GC回收
WeakReference,顧名思義,是一個(gè)弱引用,當(dāng)所引用的對(duì)象在JVM內(nèi)不再有強(qiáng)引用時(shí),將被GC回收
雖然WeakReference與SoftReference都有利于提高GC和內(nèi)存的效率,但是WeakReference,一旦失去最后一個(gè)強(qiáng)引用,就會(huì)被GC回收,而SoftReference會(huì)盡可能長的保留引用直到JVM內(nèi)存不足時(shí)才會(huì)被回收(虛擬機(jī)保證),這一特性使得SoftReference非常適合緩存應(yīng)用
10.解釋Java堆空間及GC?
當(dāng)通過Java命令啟動(dòng)Java進(jìn)程的時(shí)候,會(huì)為它分配內(nèi)存。內(nèi)存的一部分用于創(chuàng)建堆空間,當(dāng)程序中創(chuàng)建對(duì)象的時(shí)候,就從對(duì)空間中分配內(nèi)存。GC是JVM內(nèi)部的一個(gè)進(jìn)程,回收無效對(duì)象的內(nèi)存用于將來的分配。
11.Java中堆和棧有什么區(qū)別?
JVM中堆和棧屬于不同的內(nèi)存區(qū)域,使用目的也不同。棧常用于保存方法幀和局部變量,而對(duì)象總是在堆上分配。棧通常都比堆小,也不會(huì)在多個(gè)線程之間共享,而堆被整個(gè)JVM的所有線程共享。
3.并發(fā),鎖
1.volatile關(guān)鍵字,Lock
并發(fā)編程中:原子性問題,可見性問題,有序性問題。
volatile關(guān)鍵字能保證可見性,字能禁止指令重排序,但是不能保證原子性。可見性只能保證每次讀取的是最新的值,但是volatile沒辦法保證對(duì)變量的操作的原子性。在生成的會(huì)變語句中加入Lock關(guān)鍵字和內(nèi)存屏障。
Lock實(shí)現(xiàn)提供了比使用synchronized方法和語句可獲得的更廣泛的鎖定操作,它能以更優(yōu)雅的方式處理線程同步問題。用sychronized修飾的方法或者語句塊在代碼執(zhí)行完之后鎖自動(dòng)釋放,而用Lock需要我們手動(dòng)釋放鎖
2.MYSQL常用優(yōu)化(sql優(yōu)化,表結(jié)構(gòu)優(yōu)化等)
SQL優(yōu)化、表機(jī)構(gòu)優(yōu)化、索引優(yōu)化、緩存參數(shù)優(yōu)化
3.java每改一點(diǎn)都需要重新編譯打包部署,有沒有更好的方法
可以使用熱加載
4.進(jìn)程間通信有哪幾種方式?
1)管道(Pipe),2)命名管道(namedpipe),3)信號(hào)(Signal),4)消息(Message)隊(duì)列,5)共享內(nèi)存,6)內(nèi)存映射(mappedmemory),7)信號(hào)量(semaphore),8)套接口(Socket)
5.Sychronized修飾靜態(tài)方法,鎖定類本身而不是實(shí)例,非靜態(tài)方法鎖定實(shí)例。
6.操作系統(tǒng)什么情況下會(huì)死鎖?
所謂死鎖:是指多個(gè)進(jìn)程在運(yùn)行過程中因爭(zhēng)奪資源而造成的一種僵局。產(chǎn)生的原因:競(jìng)爭(zhēng)資源:當(dāng)系統(tǒng)中多個(gè)進(jìn)程使用共享資源,并且資源不足以滿足需要,會(huì)引起進(jìn)程對(duì)資源的競(jìng)爭(zhēng)而產(chǎn)生死鎖。進(jìn)程間推進(jìn)的順序非法:請(qǐng)求和釋放資源的順序不當(dāng),也同樣會(huì)導(dǎo)致產(chǎn)生進(jìn)程死鎖
7.產(chǎn)生死鎖的四個(gè)條件:
1.互斥條件(進(jìn)程獨(dú)占資源)2.請(qǐng)求與保持(進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放)3.不剝奪條件(進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪)4.循環(huán)等待(若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系)
8.如何理解分布式鎖?
由于在平時(shí)的工作中,線上服務(wù)器是分布式多臺(tái)部署的,經(jīng)常會(huì)面臨解決分布式場(chǎng)景下數(shù)據(jù)一致性的問題,那么就要利用分布式鎖來解決這些問題。
9.線程同步與阻塞的關(guān)系?同步一定阻塞嗎?阻塞一定同步嗎?
線程同步與否跟阻塞非阻塞沒關(guān)系,同步是個(gè)過程,阻塞是線程的一種狀態(tài)。多個(gè)線程操作共享變量時(shí)可能會(huì)出現(xiàn)競(jìng)爭(zhēng)。這時(shí)需要同步來防止兩個(gè)以上的線程同時(shí)進(jìn)入臨界區(qū)內(nèi),在這個(gè)過程中后進(jìn)入臨界區(qū)的線程將阻塞,等待先進(jìn)入的線程走出臨界區(qū)。
10.同步和異步有什么區(qū)別?
同步和異步最大的區(qū)別就在于。一個(gè)需要等待,一個(gè)不需要等待。同步可以避免出現(xiàn)死鎖,讀臟數(shù)據(jù)的發(fā)生,一般共享某一資源的時(shí)候用,如果每個(gè)人都有修改權(quán)限,同時(shí)修改一個(gè)文件,有可能使一個(gè)人讀取另一個(gè)人已經(jīng)刪除的內(nèi)容,就會(huì)出錯(cuò),同步就會(huì)按順序來修改。
11.線程池
根據(jù)系統(tǒng)自身的環(huán)境情況,有效的限制執(zhí)行線程的數(shù)量,使得運(yùn)行效果達(dá)到最佳。線程主要是通過控制執(zhí)行的線程的數(shù)量,超出數(shù)量的線程排隊(duì)等候,等待有任務(wù)執(zhí)行完畢,再從隊(duì)列最前面取出任務(wù)執(zhí)行
12.如何調(diào)用wait()方法?使用if塊還是循環(huán)?為什么?
wait()方法應(yīng)該在循環(huán)調(diào)用,因?yàn)楫?dāng)線程獲取到CPU開始執(zhí)行的時(shí)候,其他條件可能還沒有滿足,所以在處理前,循環(huán)檢測(cè)條件是否滿足會(huì)更好。
wait(),notify()和notifyall()方法是java.lang.Object類為線程提供的用于實(shí)現(xiàn)線程間通信的同步控制方法。等待或者喚醒
13.實(shí)現(xiàn)線程的幾種方法
(1)繼承Thread類,重寫run函數(shù)(2)實(shí)現(xiàn)Runnable接口,重寫run函數(shù)(3)實(shí)現(xiàn)Callable接口,重寫call函數(shù)
14.什么是多線程環(huán)境下的偽共享(falsesharing)?
偽共享是多線程系統(tǒng)(每個(gè)處理器有自己的局部緩存)中一個(gè)眾所周知的性能問題。緩存系統(tǒng)中是以緩存行(cacheline)為單位存儲(chǔ)的。緩存行是2的整數(shù)冪個(gè)連續(xù)字節(jié),一般為32-256個(gè)字節(jié)。最常見的緩存行大小是64個(gè)字節(jié)。當(dāng)多線程修改互相獨(dú)立的變量時(shí),如果這些變量共享同一個(gè)緩存行,就會(huì)無意中影響彼此的性能,這就是偽共享。
4.網(wǎng)絡(luò)、數(shù)據(jù)庫
1.TCP如何保證可靠傳輸?三次握手過程?
在TCP的連接中,數(shù)據(jù)流必須以正確的順序送達(dá)對(duì)方。TCP的可靠性是通過順序編號(hào)和確認(rèn)(ACK)來實(shí)現(xiàn)的。TCP連接是通過三次握手進(jìn)行初始化的。三次握手的目的是同步連接雙方的序列號(hào)和確認(rèn)號(hào)并交換TCP窗口大小信息。第一次是客戶端發(fā)起連接;第二次表示服務(wù)器收到了客戶端的請(qǐng)求;第三次表示客戶端收到了服務(wù)器的反饋。
2.Linux下你常用的命令有哪些?
3.常用的hash算法有哪些?
1.加法hash:所謂的加法Hash就是把輸入元素一個(gè)一個(gè)的加起來構(gòu)成最后的結(jié)果。
2.位運(yùn)算hash:這類型Hash函數(shù)通過利用各種位運(yùn)算(常見的是移位和異或)來充分的混合輸入元素
3.乘法hash:33*hash+key.charAt(i)
4.什么是一致性哈希?
設(shè)計(jì)目標(biāo)是為了解決因特網(wǎng)中的熱點(diǎn)(Hotspot)問題,一致性hash算法提出了在動(dòng)態(tài)變化的Cache環(huán)境中,判定哈希算法好壞的四個(gè)定義:1、平衡性(Balance)2、單調(diào)性(Monotonicity)3、分散性(Spread)4、負(fù)載(Load)
5.數(shù)據(jù)庫中的范式有哪些?
第一范式----數(shù)據(jù)庫中的表(所有字段值)都是不可分割的原子數(shù)據(jù)項(xiàng)。
第二范式----數(shù)據(jù)庫表中的每一列都和主鍵相關(guān),而不能只和主鍵的某一部分相關(guān)。
第三范式----數(shù)據(jù)庫表中每一列數(shù)據(jù)都和主鍵直接相關(guān),不能間接相關(guān)。范式是為了減小數(shù)據(jù)冗余。
6.數(shù)據(jù)庫中的索引的結(jié)構(gòu)?什么情況下適合建索引?
數(shù)據(jù)庫中索引的結(jié)構(gòu)是一種排序的數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫索引是通過B樹和變形的B+樹實(shí)現(xiàn)的。什么情況下不適合建立索引:1.對(duì)于在查詢過程中很少使用或參考的列;對(duì)于那些只有很少數(shù)據(jù)值的列;對(duì)于那些定義為image,text和bit數(shù)據(jù)類型的列;當(dāng)修改性能遠(yuǎn)大于檢索性能。
根據(jù)系統(tǒng)自身的環(huán)境情況,有效的限制執(zhí)行線程的數(shù)量,使得運(yùn)行效果達(dá)到最佳。線程主要是通過控制執(zhí)行的線程的數(shù)量,超出數(shù)量的線程排隊(duì)等候,等待有任務(wù)執(zhí)行完畢,再從隊(duì)列最前面取出任務(wù)執(zhí)行
7.concurrent包下面,都用過什么?
java.util.concurrent、java.util.concurrent.atomic和java.util.concurrent.lock
8.常用的數(shù)據(jù)庫有哪些?redis用過嗎?
Orcale,MySQL,DB2
9.你知道的開源協(xié)議有哪些?
GPL(GNUGeneralPublicLicense):GNU通用公共許可協(xié)議
LGPL(GNULesserGeneralPublicLicense):GNU寬通用公共許可協(xié)議
BSD(BerkeleySoftwareDistribution):伯克利軟件分發(fā)許可協(xié)議
MIT(MassachusettsInstituteofTechnology):MIT之名源自麻省理工學(xué)院
Apache(ApacheLicense):Apache許可協(xié)議
MPL(MozillaPublicLicense):Mozilla公共許可協(xié)議
10.表單提交中,get和post區(qū)別
1.get從服務(wù)器獲取信息,post向服務(wù)器傳信息2.get傳送數(shù)據(jù)量比較小,post可以比較大3.get安全性比較低
11.TCP協(xié)議與UDP協(xié)議有什么區(qū)別?(answer答案)
TCP(TranferControlProtocol)的縮寫,是一種面向連接的保證傳輸?shù)膮f(xié)議,在傳輸數(shù)據(jù)流前,雙方會(huì)先建立一條虛擬的通信道。可以很少差錯(cuò)傳輸數(shù)據(jù)。
UDP(UserDataGramProtocol)的縮寫,是一種無連接的協(xié)議,使用UDP傳輸數(shù)據(jù)時(shí),每個(gè)數(shù)據(jù)段都是一個(gè)獨(dú)立的信息,包括完整的源地址和目的地,在網(wǎng)絡(luò)上以任何可能的路徑傳到目的地,因此,能否到達(dá)目的地,以及到達(dá)目的地的時(shí)間和內(nèi)容的完整性都不能保證。
所以TCP必UDP多了建立連接的時(shí)間。相對(duì)UDP而言,TCP具有更高的安全性和可靠性。
TCP協(xié)議傳輸?shù)拇笮〔幌拗疲坏┻B接被建立,雙方可以按照一定的格式傳輸大量的數(shù)據(jù),而UDP是一個(gè)不可靠的協(xié)議,大小有限制,每次不能超過64K。
mysql 的隔離是什么
mysql的隔離就是指,SQL標(biāo)準(zhǔn)定義了四種隔離級(jí)別,用來限定事務(wù)內(nèi)外的哪些改變是可見的,哪些是不可見的。
譬如,讀取未提交的數(shù)據(jù)【ReadUncommitted】在該隔離級(jí)別,所有的事務(wù)都可以看到其他事務(wù)沒有提交的執(zhí)行結(jié)果。
還有,讀取提交的內(nèi)容【ReadCommitted】該隔離級(jí)別是大多數(shù)數(shù)據(jù)庫的默認(rèn)的隔離級(jí)別(不是MySQL默認(rèn)的)。它滿足了隔離的簡(jiǎn)單定義:一個(gè)事務(wù)只能看到其他的已經(jīng)提交的事務(wù)所做的改變。這種隔離級(jí)別也支持不可重復(fù)讀,即同一個(gè)select可能得到不同的結(jié)果。等等
MySQL的可重復(fù)讀級(jí)別能解決幻讀嗎
現(xiàn)在的主流數(shù)據(jù)庫都使用MVCC,用了之后的RR隔離級(jí)別是不會(huì)出現(xiàn)幻讀的。
不同的資料講的RR是199X年的ANSISQL標(biāo)準(zhǔn),但現(xiàn)實(shí)的數(shù)據(jù)庫不一定符合標(biāo)準(zhǔn)(事實(shí)上,沒有幻讀是更好的事情)。
OK,關(guān)于mysql隔離級(jí)別面試和innodb事務(wù)隔離級(jí)別的內(nèi)容到此結(jié)束了,希望對(duì)大家有所幫助。