說說你對樂觀鎖、悲觀鎖的理解?------------悲觀鎖就是每次訪問數(shù)據(jù)都有可能被其他線程修改,所以在訪問的同時對資源進(jìn)行加鎖,保證資源只能被當(dāng)前線程操作,其他線程只能阻塞直到當(dāng)前線程釋放鎖,synchronized和Lock的實現(xiàn)都屬于悲觀鎖。樂觀鎖,不會覺得訪問數(shù)據(jù)庫的同時會有人修改它,所以在訪問的同時不會加鎖阻塞其他線程的操作,但在寫入提交回去判斷是否有線程已經(jīng)修改了資源數(shù)據(jù),數(shù)據(jù)庫的version版本號去實現(xiàn),CAS算法就是一種思想。
什么是CAS算法?-----是對上個回答的填坑。內(nèi)存值、預(yù)期值、修改值的操作,將內(nèi)存值和修改值做對比,如果相等就修改,否則就不做操作……
CyclicBarrier的理解?--------翻譯過來就是循環(huán)柵欄。JUC包下的類,其構(gòu)造方法就是一組線程在達(dá)到柵欄的某個狀態(tài)后就執(zhí)行一定數(shù)量的線程。該類型的對象await()方法是是掛起作用,其重載方法可以指定掛起到一定的時間……
ReadWriteLock與ReentrantReadWriteLock的理解和區(qū)別?--------接口實現(xiàn)的關(guān)系。ReadWriteLock讀鎖(多個線程可以共同讀)和寫鎖(只有一個線程寫),對應(yīng)的readLock()和writeLock()用于讀取操作和寫入操作的鎖……。ReentrantReadWriteLock結(jié)合了ReentrantLock和ReadWriteLock的實現(xiàn),其構(gòu)造方法的重載決定了其公平或非公平的模式默認(rèn)是非公平(即沒有參數(shù))可能導(dǎo)致多個讀寫線程的推遲,而公平模式可以兼顧到等待時間將長的寫線程獲取到鎖……。
你還了解ReentrantReadWriteLock哪些特性?--------重入特性,允許讀寫重新獲取讀取鎖或?qū)懭腈i。在寫入線程保持的所有寫入鎖都被釋放后,才允許重入讀線程使用。鎖降級,允許寫鎖降級為讀鎖,通過先獲取寫入鎖,然后獲取讀取鎖,最后釋放寫入鎖,反之是不允許的。鎖獲取的中斷,讀取鎖和寫入鎖都支持獲取期間的中斷。……
線程池的理解?------高并發(fā)的大型項目中如果每個請求都去創(chuàng)建線程,那么線程的創(chuàng)建、銷毀、上下文切換等操作都會造成資源的損耗。所以需要一個專門管理線程的類,這個類負(fù)責(zé)安排空閑的線程運(yùn)行任務(wù)……
MyBatis框架的理解?--------屬于持久層的框架。通過配置文件XML或注解,將接口和POJO映射成數(shù)據(jù)庫中的記錄……相關(guān)的依賴包,數(shù)據(jù)庫表,配置文件(數(shù)據(jù)庫驅(qū)動信息,核心配置文件),實體對象,最重要的Mapper接口對實體的增刪改查操作和Mapper映射文件xml(也需要注冊到核心配置文件中),通過SqlSessionFactory創(chuàng)建SqlSession對象進(jìn)行操作……
${}和#{}的區(qū)別?------${}就是數(shù)據(jù)源中通過對數(shù)據(jù)源驅(qū)動配置引入到框架核心配置文件中的變量值,#{}mapper.xml的預(yù)編譯SQL文件……
對于XML映射文件和Mapper接口對應(yīng),這Mapper接口的原理是什么?---------也就是映射文件的namespace值對應(yīng)Mapper接口包名接口名,接口中的方法名為映射文件中的id值,接口中的方法參數(shù)為傳遞給映射文件的sql參數(shù)。Mapper接口沒有實現(xiàn)類,調(diào)用時采用接口全限名+方法名組成的字符串作為key,即可定位對應(yīng)的標(biāo)簽(,……)。Mapper接口原理是JDK動態(tài)daili(這兩個字被平臺加入到了違禁詞系統(tǒng)了……)……
什么是分頁?---------------分頁就是將數(shù)據(jù)庫表的記錄分頁顯示,比如1000條記錄,分成100頁來顯示(從0頁、0行開始),第0頁顯示第0-99條數(shù)據(jù),以此類推……。邏輯分頁,顯示每頁數(shù)據(jù)時首先查詢1000條數(shù)據(jù),然后根據(jù)當(dāng)前頁碼選出其中的100條來顯示。物理分頁,先判斷該選出的這1000條的第幾條到第幾條,然后數(shù)據(jù)庫根據(jù)給定的請求查詢出需要的100條數(shù)據(jù)返回給前端。
Mybatis如何進(jìn)行分頁?----------屬于對上個問題的延續(xù),邏輯分頁采用的是RowBounds對象進(jìn)行分頁,針對ResultSet結(jié)果集執(zhí)行的內(nèi)存分頁。物理分頁可以直接用帶有物理分頁的參數(shù),也可以使用分頁插件,在插件的攔截方法內(nèi)攔截待執(zhí)行的sql,然后重寫sql,根據(jù)方言添加對應(yīng)的物理分頁語句和參數(shù)?!?/p>
MyBatis是如何將sql執(zhí)行結(jié)果封裝為目標(biāo)對象并返回的?------采用resultMap標(biāo)簽,定義數(shù)據(jù)庫列名和對象屬性名之間的映射關(guān)系……
Mybatis的延遲加載以及實現(xiàn)原理?--------對于一對一、一對多的查詢中通過在Mybatis配置文件中啟動lazyLoadingEnabled的布爾值。其原理是使用CGLIB創(chuàng)建目標(biāo)對象的daili對象……
一級、二級緩存?----------------一級緩存是默認(rèn)的,作用域為Session,當(dāng)Session flush或close之后,Session中的所有緩存被清空。二級緩存需要手動配置開啟的,存儲作用域為namespace,即整個mapper接口……
你有什么想問的問題嗎?---------------問了下公司當(dāng)前開發(fā)的項目業(yè)務(wù)以及用到的技術(shù)棧,公司后臺的架構(gòu)分布式情況及其技術(shù)?!?/p>