Java知識點總結

Java繼承關系初始化順序

父類的靜態(tài)變量-->父類的靜態(tài)代碼塊-->子類的靜態(tài)變量-->子類的靜態(tài)代碼快-->父類的非靜態(tài)變量(父類的非靜態(tài)代碼塊)-->父類的構造函數(shù)-->子類的非靜態(tài)變量(子類的非靜態(tài)代碼塊)-->子類的構造函數(shù)

網(wǎng)絡攻擊

sql注入攻擊 SQL注入攻擊中以SQL語句作為用戶輸入用爪,從而達到查詢/修改/刪除數(shù)據(jù)的目的
xxs攻擊 xss表示Cross Site Scripting(跨站腳本攻擊)五芝,通過插入惡意腳本(比如js腳本)镶骗,實現(xiàn)對用戶游覽器的控制

Minor GC 衰琐,F(xiàn)ull GC 觸發(fā)條件

Minor GC觸發(fā)條件:當Eden區(qū)滿時虫给,觸發(fā)Minor GC交煞。
Full GC觸發(fā)條件:
(1)調(diào)用System.gc時括堤,系統(tǒng)建議執(zhí)行Full GC,但是不必然執(zhí)行
(2)老年代空間不足
(3)方法去空間不足
(4)升到老年代的對象大于老年代剩余空間
降低GC的調(diào)優(yōu)的策略:調(diào)優(yōu)諸如通過NewRatio控制新生代老年代比例荷腊,通過 MaxTenuringThreshold控制進入老年前生存次數(shù)艳悔。

mybatis一級緩存,二級緩存

一級緩存是SqlSession級別的緩存女仰。在操作數(shù)據(jù)庫時需要構造sqlSession對象猜年,在對象中有一個數(shù)據(jù)結構用于存儲緩存數(shù)據(jù)。不同的sqlSession之間的緩存數(shù)據(jù)區(qū)域是互相不影響的疾忍。
用戶發(fā)起查詢請求乔外,查找某條數(shù)據(jù),sqlSession先去緩存中查找一罩,是否有該數(shù)據(jù)杨幼,如果有,讀饶粼ā差购;
如果沒有,從數(shù)據(jù)庫中查詢歧沪,并將查詢到的數(shù)據(jù)放入一級緩存區(qū)域歹撒,供下次查找使用莲组。
但sqlSession執(zhí)行commit诊胞,即增刪改操作時會清空緩存。這么做的目的是避免臟讀锹杈。

二級緩存是全局緩存撵孤,作用域是針對Mapper的Namespace而言的,多個SqlSession去操作同一個Mapper的sql語句竭望,多個SqlSession可以共用二級緩存邪码,二級緩存是跨SqlSession的。

spring-mybatis處理事務配置

如果應用程序中直接使用JDBC來進行持久化咬清,DataSourceTransactionManager會為你處理事務邊界闭专。為了使用DataSourceTransactionManager
1.你需要使用如下的XML將其裝配到應用程序的上下文定義中,添加注解配置:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

<!--使用注釋事務 -->  
<tx:annotation-driven  transaction-manager="transactionManager" /> 

2.在需要加入事務的方法或者類上添加@Transactional
事物配置中有哪些屬性可以配置
(1).事務的傳播性:@Transactional(propagation=Propagation.REQUIRED)
如果有事務, 那么加入事務, 沒有的話新建一個(默認情況下)
(2).事務的超時性:@Transactional(timeout=30) //默認是30秒
注意這里說的是事務的超時性而不是Connection的超時性,這兩個是有區(qū)別的
(3).事務的隔離級別:@Transactional(isolation = Isolation.READ_UNCOMMITTED)
讀取未提交數(shù)據(jù)(會出現(xiàn)臟讀, 不可重復讀) 基本不使用
(4).回滾:
指定單一異常類:@Transactional(rollbackFor=RuntimeException.class)
指定多個異常類:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
該屬性用于設置需要進行回滾的異常類數(shù)組旧烧,當方法中拋出指定異常數(shù)組中的異常時影钉,則進行事務回滾。
(5).只讀:@Transactional(readOnly=true)
該屬性用于設置當前事務是否為只讀事務掘剪,設置為true表示只讀平委,false則表示可讀寫,默認值為false夺谁。

object類的基本方法

getClass(), hashCode(), equals(), clone(), toString(), notify(), notifyAll(), wait(), finalize()

mybatis分頁原理解析

https://blog.csdn.net/hupanfeng/article/details/9265341
https://blog.csdn.net/hupanfeng/article/details/9238127
sql的解析是在StatementHandler里完成的廉赔,所以為了重寫sql需要攔截StatementHandler肉微,sql重寫其實在原始的sql語句上加入分頁的參數(shù).

redis sortedMap的跳表結構

https://blog.csdn.net/sinat_35261315/article/details/62890796
1.鏈表從頭節(jié)點到尾節(jié)點是有序的
2.可以進行跳躍查找(形如二分法)

concurrent并發(fā)包中的類

BlockingQueue: 通常用于一個線程生產(chǎn)對象,而另外一個線程消費這些對象的場景蜡塌。
ConcurrentHashMap:不會鎖住整個 Map碉纳。它的內(nèi)部只是把 Map 中正在被寫入的部分進行鎖定。能夠提供比 HashTable 更好的并發(fā)性能馏艾。
閉鎖 CountDownLatch:允許一個或多個線程等待一系列指定操作的完成村象。CountDownLatch 以一個給定的數(shù)量初始化。countDown() 每被調(diào)用一次攒至,這一數(shù)量就減一厚者。通過調(diào)用 await() 方法之一,線程可以阻塞等待這一數(shù)量到達零迫吐。
柵欄 CyclicBarrier:是一種同步機制库菲,它能夠?qū)μ幚硪恍┧惴ǖ木€程實現(xiàn)同步。換句話講志膀,它就是一個所有線程必須等待的一個柵欄熙宇,直到所有線程都到達這里,然后所有線程才可以繼續(xù)做其他事情溉浙。
信號量 Semaphore:1.保護一個重要(代碼)部分防止一次超過 N 個線程進入烫止。2.在兩個線程之間發(fā)送信號。
鎖 Lock:
lock() 將 Lock 實例鎖定戳稽。如果該 Lock 實例已被鎖定馆蠕,調(diào)用 lock() 方法的線程將會阻塞,直到 Lock 實例解鎖互躬。
tryLock() 不帶參數(shù)的方法試圖立即鎖定 Lock 實例。如果鎖定成功颂郎,它將返回 true吼渡,如果 Lock 實例已被鎖定該方法返回 false。這一方法永不阻塞乓序。tryLock(long timeout, TimeUnit timeUnit) 的工作類似于 tryLock() 方法寺酪,除了它在放棄鎖定 Lock 之前等待一個給定的超時時間之外寄雀。
unlock() 方法對 Lock 實例解鎖。一個 Lock 實現(xiàn)將只允許鎖定了該對象的線程來調(diào)用此方法阿趁。其他(沒有鎖定該 Lock 對象的線程)線程對 unlock() 方法的調(diào)用將會拋一個未檢查異常(RuntimeException)皂股。
原子性整型 AtomicInteger:提供了一個可以進行原子性讀和寫操作的 int 變量。

用戶態(tài)和內(nèi)核態(tài)的區(qū)別

內(nèi)核態(tài)與用戶態(tài)是操作系統(tǒng)的兩種運行級別,當程序運行在3級特權級上時命黔,就可以稱之為運行在用戶態(tài)呜呐,因為這是最低特權級,是普通的用戶進程運行的特權級悍募,大部分用戶直接面對的程序都是運行在用戶態(tài)蘑辑;反之,當程序運行在0級特權級上時坠宴,就可以稱之為運行在內(nèi)核態(tài)洋魂。運行在用戶態(tài)下的程序不能直接訪問操作系統(tǒng)內(nèi)核數(shù)據(jù)結構和程序。當我們在系統(tǒng)中執(zhí)行一個程序時喜鼓,大部分時間是運行在用戶態(tài)下的副砍,在其需要操作系統(tǒng)幫助完成某些它沒有權力和能力完成的工作時就會切換到內(nèi)核態(tài)。
以下三種情況會導致用戶態(tài)到內(nèi)核態(tài)的切換:
這兩種狀態(tài)的主要差別是: 處于用戶態(tài)執(zhí)行時庄岖,進程所能訪問的內(nèi)存空間和對象受到限制豁翎,其所處于占有的處理機是可被搶占的 ; 而處于核心態(tài)執(zhí)行中的進程隅忿,則能訪問所有的內(nèi)存空間和對象心剥,且所占有的處理機是不允許被搶占的。
1)系統(tǒng)調(diào)用
用戶態(tài)進程通過系統(tǒng)調(diào)用申請使用操作系統(tǒng)提供的服務程序完成工作
2)異常
當CPU在執(zhí)行運行在用戶態(tài)下的程序時硼控,發(fā)生了某些事先不可知的異常刘陶,這時會觸發(fā)由當前運行進程切換到處理此異常的內(nèi)核相關程序中,也就轉(zhuǎn)到了內(nèi)核態(tài)牢撼,比如缺頁異常
3)外圍設備的中斷
當外圍設備完成用戶請求的操作后,會向CPU發(fā)出相應的中斷信號疑苫,這時CPU會暫停執(zhí)行下一條即將要執(zhí)行的指令轉(zhuǎn)而去執(zhí)行與中斷信號對應的處理程序熏版,如果先前執(zhí)行的指令是用戶態(tài)下的程序,那么這個轉(zhuǎn)換的過程自然也就發(fā)生了由用戶態(tài)到內(nèi)核態(tài)的切換捍掺。比如硬盤讀寫操作完成撼短,系統(tǒng)會切換到硬盤讀寫的中斷處理程序中執(zhí)行后續(xù)操作等。

cookie和session生命周期

cookie在不設置過期時間的情況下瀏覽器關閉后就失效了挺勿,如果設置了cokie的過期時間.那么瀏覽器會把cookie保存到硬盤中,再次打IE時會依然有效.直到超過設置的有效期曲横。
session的生命周期是間隔的,從創(chuàng)建時,開始計時如在20分鐘禾嫉,沒有訪問session灾杰,那么session生命周期被銷毀。但是熙参,如果在20分鐘內(nèi)(如在第19分鐘時)訪問過session艳吠,那么,將重新計算session的生命周期孽椰。因為保存Sessionid的cookie是臨時的(瀏覽器關閉就會銷毀)昭娩,所以我們自己手動創(chuàng)建一個持久化的cookie,用來保存sessionid黍匾。

Dubbo的實現(xiàn)

首先ServiceConfig類拿到對外提供服務的實際類ref(如:HelloWorldImpl),然后通過ProxyFactory類的getInvoker方法使用ref生成一個AbstractProxyInvoker實例栏渺,
到這一步就完成具體服務到Invoker的轉(zhuǎn)化。接下來就是Invoker轉(zhuǎn)換到Exporter的過程
Dubbo協(xié)議的Invoker轉(zhuǎn)為Exporter發(fā)生在DubboProtocol類的export方法锐涯,它主要是打開socket偵聽服務迈嘹,并接收客戶端發(fā)來的各種請求,通訊細節(jié)由Dubbo自己實現(xiàn)全庸。


image.png

Dubbo缺省協(xié)議采用單一長連接和NIO異步通訊秀仲,底層是socket長連接。


dubbo.jpg

n個數(shù)中最小的k個數(shù)

1.排序找前k個
2.局部替換法壶笼,假設前k個就最小神僵,建立最大堆,比堆頂小就替換然后調(diào)整堆
3.數(shù)據(jù)量過大覆劈,可以先分組保礼,然后每個組用2的方法,最后多路歸并

虛擬內(nèi)存和物理內(nèi)存

物理內(nèi)存就是咱們通常值得內(nèi)存條的容量责语。而虛擬內(nèi)存是指我們將硬盤空間劃分出來一部分炮障,用于與內(nèi)存同樣的作用。如果物理內(nèi)存占的多了坤候,會表現(xiàn)出系統(tǒng)反映緩慢等問題胁赢。而虛擬內(nèi)存多了,只會占用硬盤空間白筹。

i++,++i在java中并不是線程安全的

java中若要在多線程情況下使得線程安全要加鎖智末,或者用atomicInteger類,這個類的線程安全是由volatile變量實現(xiàn)的徒河,使得每次都從共享內(nèi)存讀取值系馆。

String、StringBuffer與StringBuilder的區(qū)別

String為字符串常量顽照,而StringBuilder和StringBuffer均為字符串變量由蘑,StringBuilder是線程不安全的,而StringBuffer是線程安全的。所以如果要進行的操作是多線程的尼酿,那么就要使用StringBuffer爷狈,但是在單線程的情況下,還是建議使用速度比較快的StringBuilder谓媒。

hashcode()的作用

注意:hashCode() 在散列表中才有用淆院,在其它情況下沒用。
1句惯、hashCode的存在主要是用于查找的快捷性土辩,如Hashtable,HashMap等抢野,hashCode是用來在散列存儲結構中確定對象的存儲地址的聊记;
2脾还、如果兩個對象相同誊抛,就是適用于equals(Java.lang.Object) 方法猴抹,那么這兩個對象的hashCode一定要相同;
3恃轩、如果對象的equals方法被重寫结洼,那么對象的hashCode也盡量重寫,并且產(chǎn)生hashCode使用的對象叉跛,一定要和equals方法中使用的一致松忍,否則就會違反上面提到的第2點
4、兩個對象的hashCode相同筷厘,并不一定表示兩個對象就相同鸣峭,也就是不一定適用于equals(java.lang.Object) 方法,只能夠說明這兩個對象在散列存儲結構中酥艳,如Hashtable摊溶,他們“存放在同一個籃子里”

java中的四種引用

強引用充石,軟引用莫换,弱引用,虛引用
Java中提供這四種引用類型主要有兩個目的:
第一是可以讓程序員通過代碼的方式?jīng)Q定某些對象的生命周期赫冬;
第二是有利于JVM進行垃圾回收浓镜。
強引用有引用變量指向時永遠不會被垃圾回收,JVM寧愿拋出OutOfMemory錯誤也不會回收這種對象
軟引用:如果一個對象具有軟引用劲厌,內(nèi)存空間足夠,垃圾回收器就不會回收它
弱引用:無論內(nèi)存是否充足听隐,都會回收被弱引用關聯(lián)的對象
虛引用:并不影響對象的生命周期补鼻,跟沒有引用與之關聯(lián)一樣,在任何時候都可能被垃圾回收器回收

redis線程模型

redis采用單線程模型,到達服務端风范,所有的命令都會進入一個隊列中咨跌,然后逐個被執(zhí)行。1.redis是純內(nèi)存訪問硼婿,數(shù)據(jù)存放在內(nèi)存中锌半,內(nèi)存的響應時間極快,2.采用epoll做為I/O多路復用技術的實現(xiàn)寇漫,不在I/O上浪費過多的時間刊殉,3.單線程避免了線程切換和競態(tài)產(chǎn)生的消耗,所以性能很高州胳。

LinkedHashMap如何保證有序

LinkedHashMap具有可預知的迭代順序记焊,在hashmap的基礎上采用雙向鏈表的結構,根據(jù)鏈表中元素的順序可以分為:按插入順序的鏈表栓撞,和按訪問順序(調(diào)用get方法)的鏈表遍膜,accessOrder為true時,按訪問順序排序(實現(xiàn)了實現(xiàn)LRU)瓤湘,false時瓢颅,按插入順序排序。
在使用put方法時弛说,key已存在挽懦,替換value(同HashMap),并調(diào)用recordAccess方法剃浇,方法作用為根據(jù)accessOrder的值保持鏈表順序不變或者將將訪問的當前節(jié)點移到鏈表尾部(頭結點的前一個節(jié)點)巾兆。
key不存在,添加新的Entry虎囚,仍然是Table[i]= newEntry角塑,舊鏈表首個為newEntry.next(同HashMap),將newEntry加到雙向鏈表末尾(即header前,這樣就保留了插入順序)

mysql實現(xiàn)事務的原理

多版本和快照隔離(mvcc)

MVCC是行級鎖的一個變種,但是它在很多情況下避免了加鎖操作,因此開銷更低,雖然實現(xiàn)機制有所不同,但大都實現(xiàn)了非阻塞的讀操作,寫操作也只鎖定必要的行.

MVCC的實現(xiàn)是通過保存數(shù)據(jù)在某個時間點的快照來實現(xiàn)的,也就是說,不管需要執(zhí)行多長時間,只要事務開始時間相同,每個事務看到的數(shù)據(jù)都是一致的,事務開始的時間不同時,每個事務對同一張表,同一時刻看到的數(shù)據(jù)可能是不一樣的(因為不同的時間點可能數(shù)據(jù)就已經(jīng)產(chǎn)生了不同的快照版本淘讥,而每個事務在默認的RR隔離級別下只能看到事務開始時的數(shù)據(jù)快照)

innodd的mvcc是通過在每行記錄后面保存兩個隱藏列來實現(xiàn)的.這兩個列,一個保存了行的創(chuàng)建時間.一個保存了行的過期時間(刪除時間).列里面存儲的并不是實際的時間值.而是系統(tǒng)版本號.每開啟一個新的事務,系統(tǒng)版本號都會自動遞增.

網(wǎng)絡編程

傳輸層的擁塞控制有:慢開始圃伶、擁塞避免、快重傳蒲列、快恢復

多線程如何同步:臨界區(qū)窒朋、互斥區(qū)、信號量蝗岖、事件
臨界區(qū):通過多線程串行化來訪問公共資源侥猩,速度快
互斥區(qū):擁有互斥對象的線程才具有訪問資源的權限
信號量:允許多個線程同時訪問資源,但需要限制最大線程數(shù)目抵赢,通過PV操作
事件:用來通知線程有一些事件已經(jīng)發(fā)生欺劳,從而啟動后繼任務的開始

進程間通訊方式

  1. 管道pipe:管道是一種半雙工的通信方式唧取,數(shù)據(jù)只能單向流動,而且只能在具有親緣關系的進程間使用划提。進程的親緣關系通常是指父子進程關系枫弟。
  2. 命名管道FIFO:這也是半雙工的通信方式,但是它允許無親緣關系進程間的通信鹏往。
  3. 消息隊列MessageQueue:消息隊列是由消息的鏈表淡诗,存放在內(nèi)核中并由消息隊列標識符標識。消息隊列克服了信號傳遞信息少伊履、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點韩容。
  4. 共享存儲SharedMemory:共享內(nèi)存就是映射一段能被其他進程所訪問的內(nèi)存,這段共享內(nèi)存由一個進程創(chuàng)建湾碎,但多個進程都可以訪問宙攻。共享內(nèi)存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的介褥。它往往與其他通信機制座掘,如信號兩,配合使用柔滔,來實現(xiàn)進程間的同步和通信溢陪。
  5. 信號量Semaphore:信號量是一個計數(shù)器,可以用來控制多個進程對共享資源的訪問睛廊。它常作為一種鎖機制形真,防止某進程正在訪問共享資源時,其他進程也訪問該資源超全。因此咆霜,主要作為進程間以及同一進程內(nèi)不同線程之間的同步手段。
  6. 套接字Socket:套解口也是一種進程間通信機制嘶朱,與其他通信機制不同的是蛾坯,它可用于不同進程間的進程通信。

異步:發(fā)送一個請求疏遏,不等待返回脉课,隨時發(fā)送下一個請求

Clone()方法

clone方法是一個淺拷貝。雖然是淺拷貝财异,但是拷貝生成的對象是一個新的對象倘零,對拷貝對象的基本類型屬性進行操作是不會影響原對象的基本類型屬性的,如果是對拷貝對象的引用類型屬性進行操作戳寸,是會影響到原對象的引用類型屬性的呈驶。

異常分類

微信截圖_20180810095713.png

受查異常即IOException要在方法里用try..catch代碼塊捕獲,而未檢查異常(error和RuntimeException)不需要try…catch…或throws 機制去處理

10億個數(shù)中找出最大的1000個數(shù)

先拿1000個數(shù)建堆疫鹊,然后一次添加剩余元素俐东,如果大于堆頂?shù)臄?shù)(1000中最小的)跌穗,將這個數(shù)替換堆頂订晌,并調(diào)整結構使之仍然是一個最小堆虏辫,這樣,遍歷完后锈拨,堆中的1000個數(shù)就是所需的最大的1000個砌庄。建堆時間復雜度是O(mlogm),算法的時間復雜度為O(nmlogm)(n為10億奕枢,m為1000)娄昆。

    優(yōu)化的方法:可以把所有10億個數(shù)據(jù)分組存放,比如分別放在1000個文件中缝彬。這樣處理就可以分別在每個文件的10^6個數(shù)據(jù)中找出最大的1000個數(shù)萌焰,合并到一起在再找出最終的結果

提取出某日訪問百度次數(shù)最多的那個IP

首先是這一天,并且是訪問百度的日志中的IP取出來谷浅,逐個寫入到一個大文件中扒俯。注意到IP是32位的,最多有個2^32個IP一疯。同樣可以采用映射的方法撼玄,比如模1000,把整個大文件映射為1000個小文件墩邀,再找出每個小文中出現(xiàn)頻率最大的IP(可以采用hash_map進行頻率統(tǒng)計掌猛,然后再找出頻率最大的幾個)及相應的頻率。然后再在這1000個最大的IP中眉睹,找出那個頻率最大的IP荔茬,即為所求。
或者如下闡述:
算法思想:分而治之+Hash
1竹海、IP地址最多有2^32=4G種取值情況慕蔚,所以不能完全加載到內(nèi)存中處理;
2站削、可以考慮采用分而治之的思想坊萝,按照IP地址的Hash(IP) % 1024值,把海量IP日志分別存儲到1024個小文件中许起,這樣十偶,每個小文件最多包含4MB個IP地址;
這里解釋一下為什么用Hash(IP) % 1024值园细,如果不用惦积,而直接分類的話,可能會出現(xiàn)這樣一種情況猛频,就是有個IP在每個小文件中都存在狮崩,而且這個IP并不一定在那個小文件中是數(shù)量最多的蛛勉,那么最終可能選擇的結果會有問題,所以這里用了Hash(IP)%1024值睦柴,這樣的話诽凌,通過計算IP的Hash值,相同IP肯定會放到一個文件中坦敌,當然了不同的IP的Hash值也可能相同侣诵,就存在一個小文件中。
3狱窘、對于每一個小文件杜顺,可以構建一個IP為key,出現(xiàn)的次數(shù)為value的Hash Map蘸炸,同時記錄當前出現(xiàn)次數(shù)最多的那個IP地址躬络;
4、可以得到1024個小文件中的出現(xiàn)次數(shù)最多的那個IP搭儒,再依據(jù)常規(guī)的排序算法得出總體上出現(xiàn)次數(shù)最多的IP穷当。

索引采用B+樹而不是紅黑樹?

操作系統(tǒng)讀寫磁盤的基本單位是扇區(qū)仗嗦,而文件系統(tǒng)的基本單位是簇(Cluster)膘滨。
也就是說,磁盤讀寫有一個最少內(nèi)容的限制稀拐,即使我們只需要這個簇上的一個字節(jié)的內(nèi)容火邓,我們也要含著淚把一整個簇上的內(nèi)容讀完。一個父節(jié)點只有 2 個子節(jié)點德撬,并不能填滿一個簇上的所有內(nèi)容安伞?那多余的內(nèi)容豈不是要浪費了蜓洪?我們怎么才能把浪費的這部分內(nèi)容利用起來呢纤勒?哈哈,答案就是 B+ 樹隆檀。
由于 B+ 樹分支比二叉樹更多摇天,所以相同數(shù)量的內(nèi)容,B+ 樹的深度更淺恐仑,深度代表什么泉坐?代表磁盤 io 次數(shù)啊裳仆!數(shù)據(jù)庫設計的時候 B+ 樹有多少個分支都是按照磁盤一個簇上最多能放多少節(jié)點設計的巴笕谩!
所以歧斟,涉及到磁盤上查詢的數(shù)據(jù)結構纯丸,一般都用 B+ 樹啦偏形。

JVM怎么識別class文件

每個class文件的頭4個字節(jié)稱為魔數(shù)(Magic Number),其值為:0xCAFEBABE觉鼻,它的唯一作用是用于確定這個文件是否為一個能被虛擬機接受的class文件贾陷。使用魔數(shù)而不是擴展名來進行識別主要是基于安全的考慮邪驮,因為文件的擴展名可以隨意地被改動绒障。

Hashmap多線程并發(fā)會發(fā)生什么問題

HashMap在多線程put后可能導致get無限循環(huán)

ConcurrentHashmap

ConcurrentHashMap中包括了“Segment(鎖分段)數(shù)組”,Segment包含了“HashEntry數(shù)組”贫橙,而“HashEntry數(shù)組”中的每一個HashEntry元素是一個單向鏈表。 Segment類繼承于ReentrantLock類畅姊,所以Segment本質(zhì)上是一個可重入的互斥鎖.
對于ConcurrentHashMap的添加,刪除操作吹由,在操作開始前若未,線程都會獲取Segment的互斥鎖;操作完畢之后倾鲫,才會釋放粗合。而對于讀取操作,它是通過volatile去實現(xiàn)的乌昔,HashEntry數(shù)組是volatile類型的隙疚,而volatile能保證“即對一個volatile變量的讀,總是能看到(任意線程)對這個volatile變量最后的寫入”磕道,即我們總能讀到其它線程寫入HashEntry之后的值供屉。 以上這些方式,就是ConcurrentHashMap線程安全的實現(xiàn)原理溺蕉。
1.7 1.8區(qū)別
1.拋棄了Segment分段鎖機制伶丐,利用CAS(compare and swap)機制+Synchronized來保證并發(fā)更新的安全
2.底層采用數(shù)組+鏈表+紅黑樹的存儲結構

Select,poll和epoll區(qū)別

select,poll疯特,epoll都是IO多路復用的機制哗魂。I/O多路復用就通過一種機制,可以監(jiān)視多個描述符漓雅,一旦某個描述符就緒(一般是讀就緒或者寫就緒)录别,能夠通知程序進行相應的讀寫操作。但select邻吞,poll组题,epoll本質(zhì)上都是同步I/O,因為他們都需要在讀寫事件就緒后自己負責進行讀寫吃衅,也就是說這個讀寫過程是阻塞的.
select的幾大缺點:
(1)每次調(diào)用select往踢,都需要把fd集合從用戶態(tài)拷貝到內(nèi)核態(tài),這個開銷在fd很多時會很大
(2)對socket進行掃描時是線性掃描徘层,即采用輪詢的方法峻呕,效率較低
(3)select最大的缺陷就是單個進程所打開的FD是有一定限制的利职,默認值是1024。

poll本質(zhì)上和select沒有區(qū)別,它只是沒有最大連接數(shù)的限制瘦癌,原因是它是基于鏈表來存儲的猪贪。

epoll解決了上述問題:
1、沒有最大并發(fā)連接的限制讯私,能打開的FD的上限遠大于1024
2热押、效率提升,不是輪詢的方式斤寇,不會隨著FD數(shù)目的增加效率下降桶癣。
3、內(nèi)存拷貝娘锁,利用mmap()文件映射內(nèi)存加速與內(nèi)核空間的消息傳遞牙寞;即epoll使用mmap減少復制開銷。

select和poll都只提供了一個函數(shù)——select或者poll函數(shù)莫秆。而epoll提供了三個函數(shù)间雀,epoll_create,epoll_ctl和epoll_wait,epoll_create是創(chuàng)建一個epoll句柄镊屎;epoll_ctl是注冊要監(jiān)聽的事件類型惹挟;epoll_wait則是等待事件的產(chǎn)生。

正向代理和反向代理缝驳?

正向代理:
客戶端向代理發(fā)請求连锯,代理向原始服務器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端。
反向代理:
反向代理就是屏蔽內(nèi)網(wǎng)服務器党巾,讓客戶端訪問反向代理服務器的外網(wǎng)IP萎庭,負載均衡的實現(xiàn)就是通過反向代理。

為什么內(nèi)存分為堆和棧齿拂?

變量主要是兩種形式驳规,一種內(nèi)容短小(比如一個int整數(shù))署海,需要頻繁訪問吗购,但是生命周期很短,通常只在一個方法內(nèi)存活砸狞,而另一種內(nèi)容可能很多(比如很長一個字符串)捻勉,可能不需要太頻繁的訪問,但生命周期較長刀森,通常很多個方法中可能都要用到踱启,那么自然將這兩類變量分開就顯得比較理性,一類存儲在棧區(qū),通常是局部變量埠偿、操作符棧透罢、函數(shù)參數(shù)傳遞和返回值,另一類存儲在堆區(qū)冠蒋,通常是較大的結構體(或者OOP中的對象)羽圃、需要反復訪問的全局變量

inode是什么?

文件數(shù)據(jù)都儲存在"塊"中抖剿,那么很顯然朽寞,我們還必須找到一個地方儲存文件的元信息,比如文件的創(chuàng)建者斩郎、文件的創(chuàng)建日期脑融、文件的大小等等。這種儲存文件元信息的區(qū)域就叫做inode孽拷,中文譯名為"索引節(jié)點"吨掌。
inode包含文件的元信息,具體來說有以下內(nèi)容:
  * 文件的字節(jié)數(shù)
  * 文件擁有者的User ID
  * 文件的Group ID
  * 文件的讀脓恕、寫、執(zhí)行權限
  * 文件的時間戳窿侈,共有三個:ctime指inode上一次變動的時間炼幔,mtime指文件內(nèi)容上一次變動的時間,atime指文件上一次打開的時間史简。
  * 鏈接數(shù)乃秀,即有多少文件名指向這個inode
  * 文件數(shù)據(jù)block的位置

如果頻繁老年代回收怎么分析解決

1.是否創(chuàng)建過大的對象及數(shù)組,這些會直接放入老年代
2.當系統(tǒng)中要加載的類圆兵、反射的類和調(diào)用的方法較多時跺讯,方法區(qū)可能會被占滿,在未配置為采用CMS GC的情況下也會執(zhí)行Full GC殉农,應轉(zhuǎn)為使用CMS GC刀脏。
3.注意GC日志中是否有promotion failed和concurrent mode failure兩種狀況,promotion failed是在進行Minor GC時超凳,survivor space放不下愈污、對象只能放入老年代,而此時老年代也放不下造成的轮傍;concurrent mode failure是在執(zhí)行CMS GC的過程中同時有對象要放入老年代暂雹,而此時老年代空間不足造成的。措施:增大survivor space创夜。

自己設計一個數(shù)據(jù)庫連接池怎么設計

使用LinkedList集合存放數(shù)據(jù)庫連接杭跪,實現(xiàn)javax.sql.DataSource接口。

JVM內(nèi)存結構劃分


如上圖,一共分為五塊涧尿,其中:
線程共享區(qū)域為:
1系奉、java堆
2、方法區(qū)

線程私有區(qū)域為:
3现斋、JVM棧
4喜最、本地方法棧
5、程序計數(shù)器

堆內(nèi)存是JVM最大的一塊由年輕代和老年代組成庄蹋。方法區(qū)儲存類信息瞬内,常量,靜態(tài)變量等數(shù)據(jù)限书,是線程共享的區(qū)域虫蝶。棧分為java虛擬機棧和本地方法棧主要用于方法的執(zhí)行。

HTTP Header

1倦西、通用頭 General
Request URL :請求的url
Request Method : 請求的方法能真,可以是GET、POST
Status Code:HTTP 狀態(tài)碼扰柠,表示請求成功
Referrer Policy:當從一個鏈接跳到另一個鏈接粉铐,另一個鏈接的referer就記錄了是從哪個鏈接跳來的
2、響應頭 Response Headers
Cache-Control:控制HTTP緩存
Content-Encoding:內(nèi)容的壓縮類型卤档,此處是gzip
Content-Length:返回的內(nèi)容的長度
Content-type:返回的內(nèi)容類型蝙泼,此處是html
Connection:keep-alive(TCP連接不會關閉
3、請求頭 Request Headers
Accept:瀏覽器能夠接收的內(nèi)容類型劝枣,如text/javascript
Accept-Encoding:瀏覽器支持的壓縮編碼類型汤踏。
Accept-language:瀏覽器支持的語言
Referer:發(fā)出請求的頁面的URL
User-Agent:瀏覽器的用戶代理字符串

JDK1.8hashmap引入了紅黑樹

當鏈表長度太長(默認超過8)時,鏈表就轉(zhuǎn)換為紅黑樹舔腾;
利用紅黑樹快速增刪改查的特點針對超長鏈的檢查溪胶,時間復雜度從O(n)降到了O(log2n)

Java線程池的參數(shù),拒絕策略稳诚,newFixedThreadPool使用什么阻塞隊列

1哗脖、corePoolSize:核心線程數(shù)
* 核心線程會一直存活,及時沒有任務需要執(zhí)行
* 當線程數(shù)小于核心線程數(shù)時采桃,即使有線程空閑懒熙,線程池也會優(yōu)先創(chuàng)建新線程處理
2、queueCapacity:任務隊列容量(阻塞隊列)
* 當核心線程數(shù)達到最大時普办,新任務會放在隊列中排隊等待執(zhí)行
3工扎、maxPoolSize:最大線程數(shù)
* 當線程數(shù)>=corePoolSize,且任務隊列已滿時衔蹲。線程池會創(chuàng)建新線程來處理任務
* 當線程數(shù)=maxPoolSize肢娘,且任務隊列已滿時呈础,線程池會拒絕處理任務而拋出異常
4、 keepAliveTime:線程空閑時間
* 當線程空閑時間達到keepAliveTime時橱健,線程會退出而钞,直到線程數(shù)量=corePoolSize
5、allowCoreThreadTimeout:允許核心線程超時
6拘荡、rejectedExecutionHandler:任務拒絕處理器
* 兩種情況會拒絕處理任務:
- 當線程數(shù)已經(jīng)達到maxPoolSize臼节,且隊列已滿,會拒絕新任務
- 當線程池被調(diào)用shutdown()后珊皿,會等待線程池里的任務執(zhí)行完畢网缝,再shutdown。如果在調(diào)用shutdown()和線程池真正
四種策略:

  • AbortPolicy 丟棄任務蟋定,拋運行時異常
  • CallerRunsPolicy 執(zhí)行任務
  • DiscardPolicy 忽視粉臊,什么都不會發(fā)生
  • DiscardOldestPolicy 從隊列中踢出最先進入隊列(最后一個執(zhí)行)的任務

newFixedThreadPool使用了SynchronousQueue(同步隊列)這種隊列,這種隊列的特點是不緩存數(shù)據(jù)驶兜,而是緩存線程扼仲,線程分為生產(chǎn)者線程和消費者線程,一個生產(chǎn)者線程和一個消費者線程是互補的抄淑,當一個生產(chǎn)者線程遇到一個消費者線程的時候就會直接進行數(shù)據(jù)交換屠凶。一個線程只能緩存一個數(shù)據(jù),當一個線程插入數(shù)據(jù)之后就會被阻塞肆资,直到另外一個線程消費了其中的數(shù)據(jù)阅畴。

tcp粘包和拆包

原因
1.應用程序?qū)懭氲臄?shù)據(jù)大于套接字緩沖區(qū)大小,這將會發(fā)生拆包迅耘。
2.應用程序?qū)懭霐?shù)據(jù)小于套接字緩沖區(qū)大小,網(wǎng)卡將應用多次寫入的數(shù)據(jù)發(fā)送到網(wǎng)絡上监署,這將會發(fā)生粘包颤专。
3.接收方法不及時讀取套接字緩沖區(qū)數(shù)據(jù),這將發(fā)生粘包钠乏。

如何解決
使用帶消息頭的協(xié)議栖秕、消息頭存儲消息開始標識及消息長度信息,服務端獲取消息頭的時候解析出消息長度晓避,然后向后讀取該長度的內(nèi)容簇捍。
設置定長消息,服務端每次讀取既定長度的內(nèi)容作為一條完整消息俏拱。
設置消息邊界暑塑,服務端從網(wǎng)絡流中按消息編輯分離出消息內(nèi)容。

孤兒進程,僵尸進程和守護進程

1.孤兒進程
  如果父進程先退出,子進程還沒退出那么子進程將被 托孤給init進程,這是子進程的父進程就是init進程(1號進程)
2.僵尸進程
如果一個進程已經(jīng)終止了,但是其父進程還沒有獲取其狀態(tài),那么這個進程就稱之為僵尸進程.僵尸進程還會消耗一定的系統(tǒng)資源,并且還保留一些概要信息供父進程查詢子進程的狀態(tài)可以提供父進程想要的信息.一旦父進程得到想要的信息,僵尸進程就會結束.
3.守護進程
守護進程就是在后臺運行,不與任何終端關聯(lián)的進程,通常情況下守護進程在系統(tǒng)啟動時就在運行,它們以root用戶或者其他特殊用戶(apache和postfix)運行,并能處理一些系統(tǒng)級的任務.習慣上守護進程的名字通常以d結尾(sshd),但這些不是必須的.

Array和ArrayList區(qū)別

Array的長度不可變锅必,當數(shù)據(jù)超過容量大小會報下標越界異常事格。ArrayList會自動擴容,默認方式是oldCapacity + (oldCapacity >> 1),相當于擴容1.5倍驹愚,用位運算性能會好一些

maven項目的打包類型:pom远搪、jar、war

項目中一般使用maven進行模塊管理,每個模塊下對應都有一個pom文件,pom文件中維護了各模塊之間的依賴和繼承關系氛魁。項目模塊化可以將通用的部分抽離出來栽燕,方便重用;修改一部分代碼不再是build整個項目舶沛,縮短了build時間;此外各模塊都有自己的pom文件,結構更清晰窍荧。

使用maven進行模塊劃分管理,一般都會有一個父級項目恨憎,pom文件除了GAV(groupId, artifactId, version)是必須要配置的蕊退,另一個重要的屬性就是packaging打包類型,所有的父級項目的packaging都為pom憔恳,packaging默認是jar類型瓤荔,如果不作配置,maven會將該項目打成jar包钥组。作為父級項目输硝,還有一個重要的屬性,那就是modules程梦,通過modules標簽將項目的所有子項目引用進來点把,在build父級項目時,會根據(jù)子模塊的相互依賴關系整理一個build順序屿附,然后依次build郎逃。

而對于各個子項目,需要在其對應的pom文件開頭申明對父級項目的引用挺份,通過GAV實現(xiàn)褒翰。對于子項目自己的GAV配置,GV如果不配置匀泊,則會從父級項目的配置繼承過來优训。子模塊可通過dependencies標簽來添加自己的依賴,此外子類項目的packaging值只能是war或者jar各聘,前面已經(jīng)說過揣非,packaging默認是jar類型。如果是需要部署的項目伦吠,則需要打包成war類型妆兑,如果只是內(nèi)部調(diào)用或者是作服務使用魂拦,則推薦打包成jar類型。

線程的幾種狀態(tài)

1.新建狀態(tài)(New):
當用new操作符創(chuàng)建一個線程時搁嗓, 例如new Thread(r)芯勘,線程還沒有開始運行,此時線程處在新建狀態(tài)腺逛。 當一個線程處于新生狀態(tài)時荷愕,程序還沒有開始運行線程中的代碼
2.就緒狀態(tài)(Runnable)
一個新創(chuàng)建的線程并不自動開始運行,要執(zhí)行線程棍矛,必須調(diào)用線程的start()方法安疗。當線程對象調(diào)用start()方法即啟動了線程,start()方法創(chuàng)建線程運行的系統(tǒng)資源够委,并調(diào)度線程運行run()方法荐类。當start()方法返回后,線程就處于就緒狀態(tài)茁帽。
處于就緒狀態(tài)的線程并不一定立即運行run()方法玉罐,線程還必須同其他線程競爭CPU時間,只有獲得CPU時間才可以運行線程潘拨。因為在單CPU的計算機系統(tǒng)中吊输,不可能同時運行多個線程,一個時刻僅有一個線程處于運行狀態(tài)铁追。因此此時可能有多個線程處于就緒狀態(tài)季蚂。對多個處于就緒狀態(tài)的線程是由Java運行時系統(tǒng)的線程調(diào)度程序(thread scheduler)來調(diào)度的。
3.運行狀態(tài)(Running)
當線程獲得CPU時間后琅束,它才進入運行狀態(tài)扭屁,真正開始執(zhí)行run()方法.
4.阻塞狀態(tài)(Blocked)
線程運行過程中,可能由于各種原因進入阻塞狀態(tài):
1.線程通過調(diào)用sleep方法進入睡眠狀態(tài)涩禀;
2.線程調(diào)用一個在I/O上被阻塞的操作疯搅,即該操作在輸入輸出操作完成之前不會返回到它的調(diào)用者;
3.線程試圖得到一個鎖埋泵,而該鎖正被其他線程持有;
4.線程在等待某個觸發(fā)條件罪治;
......
所謂阻塞狀態(tài)是正在運行的線程沒有運行結束丽声,暫時讓出CPU,這時其他處于就緒狀態(tài)的線程就可以獲得CPU時間觉义,進入運行狀態(tài)雁社。
5.死亡狀態(tài)(Dead)
有兩個原因會導致線程死亡:
1) run方法正常退出而自然死亡,
2) 一個未捕獲的異常終止了run方法而使線程猝死晒骇。
為了確定線程在當前是否存活著(就是要么是可運行的霉撵,要么是被阻塞了)磺浙,需要使用isAlive方法。如果是可運行或被阻塞徒坡,這個方法返回true撕氧; 如果線程仍舊是new狀態(tài)且不是可運行的, 或者線程死亡了喇完,則返回false.

找一個數(shù)在40億個數(shù)中是否存在

首先知道int的范圍[-231,231-1],unsigned int的范圍是[0,232-1],都最多有232個數(shù)伦泥,用Bit-map的方法,申請2^32 bit的空間锦溪,即512M[(2^20)x(8)x(512)]的內(nèi)存不脯,1Byte=8bit,讀入要查詢的數(shù)刻诊,查看相應的bit位是否為1防楷,為1表示存在,0表示不存在则涯。如果是要找40億個數(shù)中只出現(xiàn)一次的整數(shù)复局,可以采用2-bitmap(每個數(shù)分配2bit,00表示不存在,01表示存在1次是整,10表示存在多次肖揣,11表示無意義),申請1G的內(nèi)存浮入,然后依次掃描40億個數(shù)龙优,最后輸出對應位是01的整數(shù)。如果允許一定的出錯率可以采用布隆過濾器:原理是采用k個相互獨立的hash函數(shù)事秀,保證在給定的空間彤断、誤判率下,完成元素判重的過程易迹。由于Bitmap不是萬能的宰衙,如果數(shù)據(jù)量大到一定程度,就不能用了睹欲,而且bitmap只能是對于每一個可能的整型值供炼,通過直接尋址的方式進行映射,相當于一個hash函數(shù)窘疮。

分布式的常見問題

  • 分布式事務:
    這是一個老生常談的問題袋哼,我們都知道事務就是一些列操作的原子性保證,在單機的情況下闸衫,我們能夠依靠本機的數(shù)據(jù)庫連接和組件輕易做到事務的控制涛贯,但是分布式情況下,業(yè)務原子性操作很可能是跨服務的蔚出,這樣就導致了分布式事務弟翘,例如A和B操作分別是不同服務下的同一個事務操作內(nèi)的操作虫腋,A調(diào)用B,A如果可以清楚的知道B是否成功提交從而控制自身的提交還是回滾操作稀余,但是在分布式系統(tǒng)中調(diào)用會出現(xiàn)一個新狀態(tài)就是超時悦冀,就是A無法知道B是成功還是失敗,這個時候A是提交本地事務還是回滾呢滚躯?其實這是一個很難的問題雏门,如果強行保證事務一致性,可以采取分布式鎖掸掏,但是那樣會增加系統(tǒng)復雜度而且會增大系統(tǒng)的開銷茁影,而且事務跨越的服務越多,消耗的資源越大丧凤,性能越低募闲,所以最好的解決方案就是避免分布式事務。
    還有一種解決方案就是重試機制愿待,但是重試如果不是查詢接口浩螺,必然涉及到數(shù)據(jù)庫的變更,如果第一次調(diào)用成功但是沒返回成功結果仍侥,那調(diào)用方第二次調(diào)用對調(diào)用方來說依然是重試要出,但是對于被調(diào)用方來說是重復調(diào)用,例如A向B轉(zhuǎn)賬农渊,A-100,B + 100患蹂,這樣會導致A扣了100,而B增加200砸紊。這樣的結果不是我們期望的传于,因此需在要寫入的接口做冪等設計。多次調(diào)用和單次調(diào)用是一樣的效果醉顽。通痴恿铮可以設置一個唯一鍵,在寫入的時候查詢是否已經(jīng)存在游添,避免重復寫入系草。但是冪等設計的一個前提就是服務是高可用,否則無論怎么重試都不能調(diào)用返回一個明確的結果調(diào)用方會一直等待唆涝,雖然可以限制重試的次數(shù)悄但,但是這已經(jīng)進入了異常狀態(tài)了,甚至到了極端情況還是需要人肉補償處理石抡。其實根據(jù)CAP和BASE理論,不可能在高可用分布式情況下做到一致性助泽,一般都是最終一致性保證啰扛。
  • 負載均衡
    每個服務單獨部署嚎京,為了達到高可用,每個服務至少是兩臺機器隐解,因為互聯(lián)網(wǎng)公司一般使用可靠性不是特別高的普通機器鞍帝,長期運行宕機概率很高,所以兩臺機器能夠大大降低服務不可用的可能性煞茫,這正大型項目會采用十幾臺甚至上百臺來部署一個服務帕涌,這不僅是保證服務的高可用,更是提升服務的QPS续徽,但是這樣又帶來一個問題蚓曼,一個請求過來到底路由到哪臺機器?路由算法很多钦扭,有DNS路由纫版,如果session在本機,還會根據(jù)用戶id或則cookie等信息路由到固定的機器客情,當然現(xiàn)在應用服務器為了擴展的方便都會設計為無狀態(tài)的其弊,session會保存到專有的session服務器,所以不會涉及到拿不到session問題膀斋。那路由規(guī)則是隨機獲取么梭伐?這是一個方法,但是據(jù)我所知仰担,實際情況肯定比這個復雜糊识,在一定范圍內(nèi)隨機,但是在大的范圍也會分為很多個域惰匙,例如如果為了保證異地多活的多機房技掏,夸機房調(diào)用的開銷太大,肯定會優(yōu)先選擇同機房的服務项鬼,這個要參考具體的機器分布來考慮哑梳。常用算法: 隨機算法,輪詢绘盟,一致性hash
  • 服務發(fā)現(xiàn)
    服務的提供者如何被服務的使用者發(fā)現(xiàn)鸠真,當然很多情況一個服務既是某些服務的提供者,也是其他服務的使用者龄毡,這就需要一個中間的機制來讓大家互相感知吠卷,例如Zookeeper(簡稱ZK),我簡單介紹下ZK的作用和實現(xiàn)沦零,其他類似于spring boot的Eureka和taobao的HSF的配置中心大概都一樣的作用祭隔,只是不同的技術實現(xiàn)而已。Zookeeper是一個高可用集群組件路操,因為它可以在集群之間保持同步和一致疾渴,維護統(tǒng)一的一個類似于文件目錄的結構千贯。ZK包含服務端和客戶端,每個機器維護一個客戶端保持與服務端的心跳搞坝,客戶端可以在整個目錄的任何節(jié)點設置Watcher感知搔谴,這樣只要ZK維護的該目錄有任何改動,客戶端都能收到回調(diào)通知桩撮。如果這個目錄存放的某個服務提供者的ip列表敦第,ZK能夠感知該服務的心跳,一旦該機器與ZK失去聯(lián)系店量,目錄變化芜果,服務使用者感知到請求,這樣服務使用者調(diào)用的時候就獲取不到該服務提供者的ip垫桂,這樣完成動態(tài)的失效轉(zhuǎn)移师幕。當服務恢復,ip又添加回原有ZK維護的節(jié)點列表诬滩。ZK采用了Paxos算法保證了ZK之間的一致性霹粥,內(nèi)部的選舉機制保證了集群只要有超過半數(shù)的機器正常,集群就可用疼鸟。高可用的ZK成為一個服務的訂閱與通知的中心后控,這樣完成服務發(fā)現(xiàn)的功能。
  • 數(shù)據(jù)庫性能與高可用
    數(shù)據(jù)庫是重要的部分空镜,因為大部門時候我們需要持久化很多數(shù)據(jù)完成業(yè)務邏輯浩淘,但是數(shù)據(jù)庫很難像應用服務器那樣做到線性的擴容,尤其是關系數(shù)據(jù)庫吴攒,所以現(xiàn)在會引入一些對集群支持比較好的NoSQL去支撐系統(tǒng)對性能的要求张抄,但是NoSQL也有很多局限性,例如沒有事務支持洼怔,這點在一些對事務敏感的情況下是難以忍受的署惯,還有查詢的不方便,很難支持join等操作,所以NoSQL的使用對于場景的判斷非常重要,現(xiàn)在Redis和Memcache等更多應用在緩存使用上锌蓄,核心數(shù)據(jù)庫依然采用關系數(shù)據(jù)庫,以MySQL為代表轻猖。數(shù)據(jù)庫的性能主要是在查詢的優(yōu)化上,項目實戰(zhàn)中DBA經(jīng)常會警告一些常用的SQL并沒走索引進行了全表掃描域那,所以合理使用索引進行高效的查詢是很必要的咙边。當然索引也不是建立的越多越好,例如某些重復率很高的字段不適合建索引,大量的索引甚至比數(shù)據(jù)本身更占用空間败许。對于數(shù)據(jù)量多的情況友瘤,我們可以采用分表分庫的方案進行拆分,分表一般采用關鍵字段進行取模檐束,盡量讓多個表進行均分。負載過高可以采用主從讀寫分離等等束倍。
    高可用的數(shù)據(jù)庫一般采用主從機制被丧,主庫掛了之后會自動轉(zhuǎn)移到備庫,曾經(jīng)跟DBA討論過绪妹,線上不能引入流量到備庫甥桂,如果性能不夠自動擴容,因為如果線上主庫掛掉邮旷,瞬間流量落到從庫依然會掛黄选,到頭一臺機器也不能用了。原則主從是為了高可用婶肩,而不是為了擴容办陷,擴容操作應該在機器負載較高的時候就能收到警報之后。能夠失效轉(zhuǎn)移÷杉撸現(xiàn)在高可用主要的方案也是冗余民镜,包括異地機房等等,本質(zhì)上都是冗余险毁。
  • 腦裂問題

高性能并發(fā)服務器的實現(xiàn)

高并發(fā)的核心是集群

  • 1制圈、動靜分離,靜態(tài)資源請求與動態(tài)請求分離畔况,項目中需要訪問的圖片鲸鹦、聲音、js/css等靜態(tài)資源需要有獨立的存放位置跷跪,便于將來實現(xiàn)靜態(tài)請求分離時直接剝離出來馋嗜,比如nginx可以直接配置圖片文件直接訪問目錄,而不需要經(jīng)過tomcat域庇。這樣tomcat就可以專注處理動態(tài)請求嵌戈,操作數(shù)據(jù)庫數(shù)據(jù)處理之類的。靜態(tài)請求代理服務器性能比tomcat高很多听皿。

  • 2熟呛、引入緩存,數(shù)據(jù)庫緩存(一級緩存,二級緩存,分布式緩存)尉姨、頁面緩存庵朝,這東西好用不復雜,搞明白什么地方適用最重要。簡單的例子是頻繁讀取九府,不修改的地方最適用椎瘟。也是后續(xù)集群做數(shù)據(jù)共享的一個方式之一,集群環(huán)境下侄旬,經(jīng)常會碰到數(shù)據(jù)共享問題肺蔚。

  • 3、如果將來數(shù)據(jù)量大儡羔,單一數(shù)據(jù)庫成為瓶頸時宣羊,數(shù)據(jù)庫的讀寫分離來了。數(shù)據(jù)庫集群汰蜘,讀寫分離仇冯,分表分區(qū)。mysql對讀寫分離這些還是有點支持的族操,沒仔細用過苛坚。

  • 4、如果項目發(fā)展壯大了色难,已經(jīng)過億用戶了泼舱,ok系統(tǒng)拆分來了。用戶管理系統(tǒng)莱预、訂單系統(tǒng)柠掂,或者體育新聞系統(tǒng)、娛樂新聞系統(tǒng)等依沮。保證一個系統(tǒng)當?shù)魰r不影響另一個涯贞,同時分擔單系統(tǒng)壓力。每個系統(tǒng)之下是前面3條N:怼宋渔!

mysql主從復制原理

820365-20160821160615776-1749314661.png

從庫生成兩個線程,一個I/O線程辜限,一個SQL線程皇拣;
i/o線程去請求主庫 的binlog,并將得到的binlog日志寫到relay log(中繼日志) 文件中薄嫡;
主庫會生成一個 log dump 線程氧急,用來給從庫 i/o線程傳binlog;
SQL 線程毫深,會讀取relay log文件中的日志吩坝,并解析成具體操作,來實現(xiàn)主從的操作一致哑蔫,而最終數(shù)據(jù)一致钉寝;

類型轉(zhuǎn)換

其他類型轉(zhuǎn)string:String s= String.valueOf(value) 其中 value為任意類型
string轉(zhuǎn)int :int i = Integer.parseInt( s )弧呐;
String轉(zhuǎn)stringbuffer: StringBuffer buffer = new StringBuffer(str);
將字符串變量轉(zhuǎn)換為字符數(shù)組:char[] ch=str.toCharArray();

給了一個場景讓進行SQL設計,然后優(yōu)化

Java虛擬機棧里面放的什么東西嵌纲?

  • 局部變量表俘枫,顧名思義,想必不用解釋大家應該明白它的作用了吧逮走。就是用來存儲方法中的局部變量(包括在方法中聲明的非靜態(tài)變量以及函數(shù)形參)鸠蚪。對于基本數(shù)據(jù)類型的變量,則直接存儲它的值师溅,對于引用類型的變量邓嘹,則存的是指向?qū)ο蟮囊谩>植孔兞勘淼拇笮≡诰幾g器就可以確定其大小了险胰,因此在程序執(zhí)行期間局部變量表的大小是不會改變的。
  • 操作數(shù)棧矿筝,想必學過數(shù)據(jù)結構中的棧的朋友想必對表達式求值問題不會陌生起便,棧最典型的一個應用就是用來對表達式求值。想想一個線程執(zhí)行方法的過程中窖维,實際上就是不斷執(zhí)行語句的過程榆综,而歸根到底就是進行計算的過程。因此可以這么說铸史,程序中的所有計算過程都是在借助于操作數(shù)棧來完成的鼻疮。
  • 指向運行時常量池的引用,因為在方法執(zhí)行的過程中有可能需要用到類中的常量琳轿,所以必須要有一個引用指向運行時常量判沟。
  • 方法返回地址,當一個方法執(zhí)行完畢之后崭篡,要返回之前調(diào)用它的地方挪哄,因此在棧幀中必須保存一個方法返回地址。

內(nèi)存泄漏了解多少琉闪,想辦法寫程序把堆內(nèi)存搞垮迹炼,把棧內(nèi)存呢?方法區(qū)呢颠毙?

mybatis和hibernate的區(qū)別

mybatis算半自動的ORM,著力點在POJO與SQL語句之間的映射斯入,他不會自動生成SQL語句,需程序員自己編寫蛀蜜,將SQL參數(shù)及返回結果字段映射到指定POJO; hibernate是全自動ORM刻两,實現(xiàn)了POJO和數(shù)據(jù)庫表之間的映射,以及SQL的自動生成和執(zhí)行涵防。

mybatis中#{}和${}的區(qū)別

#{}將傳入的數(shù)據(jù)都當成一個字符串闹伪,會對自動傳入的數(shù)據(jù)加一個雙引號沪铭。{}將傳入的數(shù)據(jù)直接顯示生成在sql中。#{}能在很大程度上防止sql注入偏瓤,用order by時要用{}杀怠。

分代收集算法,說說你了解的垃圾收集器厅克。具體說說CMS收集器和G1收集器

標記-清除赔退,復制,標記-整理
CMS收集器是一種以獲取最短回收停頓時間為目標的收集器证舟∷镀欤基于“標記-清除”算法實現(xiàn),它的運作過程如下:
1)初始標記2)并發(fā)標記3)重新標記4)并發(fā)清除
初始標記僅僅標記GC Root能直接關聯(lián)到的對象女责,重新標記是為了修正并發(fā)標記期間因用戶線程繼續(xù)運作而導致標記產(chǎn)生變動的那一部分對象的標記記錄漆枚。這兩者會"stop the world",但時間很短。
并發(fā)標記主要是GC Root Tracing ,和并發(fā)清除這兩者耗時較長抵知,但可與用戶線程一起工作
主要優(yōu)點:并發(fā)收集墙基、低停頓。
缺點:
1)CMS收集器對CPU資源非常敏感刷喜。在并發(fā)階段残制,它雖然不會導致用戶線程停頓,但是會因為占用了一部分線程而導致應用程序變慢掖疮,總吞吐量會降低初茶。
2)CMS無法處理浮動垃圾,浮動垃圾是指由于并發(fā)清理階段用戶線程還在運行浊闪,此時產(chǎn)生的垃圾出現(xiàn)在標記過程之后恼布,CMS無法在當次收集中處理掉他們。
3)CMS是一款“標記--清除”算法實現(xiàn)的收集器搁宾,容易出現(xiàn)大量空間碎片桥氏。會給大對象的分配造成很大麻煩。

G1與CMS的“標記--清理”算法不同猛铅,G1從整體來看是基于“標記整理”算法實現(xiàn)的收集器(標記整理:整理過程是讓所有存活的對象都向一端移動字支,然后直接清理掉端邊界以外的內(nèi)存);從局部上來看是基于“復制”算法實現(xiàn)的(復制算法:將可用內(nèi)存按容量劃分為大小相等的兩塊奸忽,每次只使用其中的一塊堕伪。當這一塊的內(nèi)存用完了,先暫停程序的運行栗菜,就將還存活著的對象復制到另外一塊上面欠雌,然后再把已經(jīng)使用過的內(nèi)存空間一次清理掉。缺點:內(nèi)存縮小為原來的一半)疙筹。就不會產(chǎn)生內(nèi)存空間碎片富俄。
G1相對于CMS的另一個大優(yōu)勢禁炒,降低停頓時間是G1和CMS共同的關注點,但G1除了追求低停頓外霍比,還能建立可預測的停頓時間模型幕袱,能讓使用者明確指定在一個長度為M毫秒的時間片段內(nèi),消耗在垃圾收集的時間不得超過N毫秒悠瞬。

多線程的使用場景

1.實現(xiàn)響應更快的應用程序们豌, 即主線程專門監(jiān)聽用戶請求,子線程用來處理用戶請求浅妆。以獲得大的吞吐量望迎。比如JavaWeb的就是主線程專門監(jiān)聽用戶的HTTP請求,然后啟動子線程去處理用戶的HTTP請求凌外。
2.某種優(yōu)先級雖然很低的服務辩尊,但是卻要不定時去做。比如Jvm的垃圾回收康辑。

volatile關鍵字对省,有啥作用,重排序晾捏,內(nèi)存屏障

指令重排序:一般來說,處理器為了提高程序運行效率哀托,可能會對輸入代碼進行優(yōu)化惦辛,它不保證程序中各個語句的執(zhí)行先后順序同代碼中的順序一致,但是它會保證程序最終執(zhí)行結果和代碼順序執(zhí)行的結果是一致的仓手。
內(nèi)存屏障是這樣一條cpu指令: a)確保一些特定操作執(zhí)行的順序胖齐; b)影響一些數(shù)據(jù)的可見性(可能是某些指令執(zhí)行后的結果)。
如果你的字段是volatile嗽冒,Java內(nèi)存模型將在寫操作后插入一個寫屏障指令呀伙,在讀操作前插入一個讀屏障指令。
這意味著如果你對一個volatile字段進行寫操作添坊,你必須知道:
1剿另、一旦你完成寫入,任何訪問這個字段的線程將會得到最新的值贬蛙。
2雨女、在你寫入前,會保證所有之前發(fā)生的事已經(jīng)發(fā)生阳准,并且任何更新過的數(shù)據(jù)值也是可見的氛堕,因為內(nèi)存屏障會把之前的寫入值都刷新到緩存。

線程池的內(nèi)部參數(shù)有哪些野蝇,什么含義讼稚。如果讓你來設計一個線程池你會怎么設計

具體解釋一下可重入鎖括儒,為啥叫可重入鎖

同一個線程再次進入同步代碼的時候.可以使用自己已經(jīng)獲取到的鎖,這就是可重入鎖java里面內(nèi)置鎖(synchronize)和Lock(ReentrantLock)都是可重入的。如果線程A繼續(xù)再次獲得這個鎖呢?比如一個方法是synchronized,遞歸調(diào)用自己,那么第一次已經(jīng)獲得了鎖,第二次調(diào)用的時候還能進入嗎? 直觀上當然需要能進入.這就要求必須是可重入的.可重入鎖又叫做遞歸鎖锐想。
可重入鎖的實現(xiàn)
為每個鎖關聯(lián)一個獲取計數(shù)器和一個所有者線程,當計數(shù)值為0的時候,這個所就沒有被任何線程只有.當線程請求一個未被持有的鎖時,JVM將記下鎖的持有者,并且將獲取計數(shù)值置為1,如果同一個線程再次獲取這個鎖,技術值將遞增,退出一次同步代碼塊,計算值遞減,當計數(shù)值為0時,這個鎖就被釋放.ReentrantLock里面有實現(xiàn)

SpringMVC與Struts2區(qū)別

1帮寻、Struts2采用Filter(StrutsPrepareAndExecuteFilter)實現(xiàn),SpringMVC(DispatcherServlet)則采用Servlet實現(xiàn)痛倚。
2规婆、攔截機制
1)、Struts2
a蝉稳、Struts2框架是類級別的攔截抒蚜,每次請求就會創(chuàng)建一個Action,和Spring整合時Struts2的ActionBean注入作用域是原型模式prototype(否則會出現(xiàn)線程并發(fā)問題)耘戚,然后通過setter嗡髓,getter吧request數(shù)據(jù)注入到屬性。
b收津、Struts2中饿这,一個Action對應一個request,response上下文撞秋,在接收參數(shù)時长捧,可以通過屬性接收,這說明屬性參數(shù)是讓多個方法共享的吻贿。
c串结、Struts2中Action的一個方法可以對應一個url,而其類屬性卻被所有方法共享舅列,這也就無法用注解或其他方式標識其所屬方法了
2)肌割、SpringMVC
a、SpringMVC是方法級別的攔截帐要,一個方法對應一個Request上下文赡矢,所以方法直接基本上是獨立的窗声,獨享request盛泡,response數(shù)據(jù)憾赁。而每個方法同時又何一個url對應,參數(shù)的傳遞是直接注入到方法中的赠橙,是方法所獨有的伸蚯。處理結果通過ModeMap返回給框架。
b简烤、在Spring整合時剂邮,SpringMVC的Controller Bean默認單例模式Singleton,所以默認對所有的請求横侦,只會創(chuàng)建一個Controller挥萌,有應為沒有共享的屬性绰姻,所以是線程安全的,如果要改變默認的作用域引瀑,需要添加@Scope注解修改狂芋。

Java中公平鎖與非公平鎖的區(qū)別

所謂公平鎖指的是哪個線程先運行,那就可以先得到鎖憨栽。非公平鎖是不管線程是否是先運行帜矾,都是隨機獲得鎖的。
非公平鎖:ReentrantLock()或ReentrantLock(false)屑柔,synchronized是非公平的
公平鎖:ReentrantLock(true)

HashSet保證元素唯一性的原理

使用Set集合是要去除重復元素屡萤,如果在存儲的時候逐equals()比較,效率太低掸宛,哈希算法提高了去重復的效率死陆,減少了使用equals()方法的次數(shù),當HashSet對象調(diào)用add()方法存儲對象時唧瘾,會調(diào)用對象的HashCode()方法得到一個哈希值措译,然后在集合中查找是否有哈希值相同的對象,如果用饰序,則調(diào)用equals()方法比較领虹,如果沒有則直接存入集合。

git和svn的區(qū)別

1.git本身關心文件的整體性是否有改變求豫,但多數(shù)的 svn系統(tǒng)則在乎文件內(nèi)容的差異塌衰。

  1. SVN 是集中式或者有中心式版本控制系統(tǒng),版本庫是集中放在中央服務器的注祖,而干活的時候,用的都是自己的電腦均唉,所以首先要從中央服務器哪里得到最新的版本是晨,然后干活,干完后舔箭,需要把自己做完的活推送到中央服務器罩缴。 SVN 是集中式或者有中心式版本控制系統(tǒng),版本庫是集中放在中央服務器的层扶,而干活的時候箫章,用的都是自己的電腦,所以首先要從中央服務器哪里得到最新的版本镜会,然后干活檬寂,干完后,需要把自己做完的活推送到中央服務器戳表。

反射

Java反射框架主要提供以下功能:

1.在運行時判斷任意一個對象所屬的類桶至;
2.在運行時構造任意一個類的對象昼伴;
3.在運行時判斷任意一個類所具有的成員變量和方法(通過反射甚至可以調(diào)用private方法);
4.在運行時調(diào)用任意一個對象的方法

索引類型镣屹?索引失效條件圃郊?索引為什么能提高效率?

類型:1.普通索引:基本索引女蜈,沒什么限制持舆;ADD INDEX index_name ( column ) 2,唯一索引:值必須唯一伪窖,但允許有空逸寓;ADD UNIQUE (column) 3.主鍵索引:一個表只能一個主鍵;ALTER TABLE table_name ADD PRIMARY KEY ( column ) 4.全文索引:僅僅用于MyISAM表惰许;5.組合索引:遵循最左前綴原則席覆。ADD INDEX index_name ( column1, column2, column3 )

失效條件:1.條件有or(要生效,or條件的每個列都加索引)汹买;2.like查詢以%開頭佩伤;3.列類型是字符串,在條件中將數(shù)據(jù)用引號引用起晦毙,否則失效生巡;4.多列字段做索引,要從左到右见妒,否則失效孤荣。

索引通過事先排好序,在查找時刻應用二分查找等高效算法须揣,一般的順序查找時間復雜度為O(n),而二分查找的時間復雜度為O(log2n),當n很大時盐股,二者效率懸殊,例如50w條數(shù)據(jù)耻卡,用二分法不超過20次就能查找到疯汁。

session與cookie的區(qū)別:

1 隱私策略不同。Cookie存儲在客戶端卵酪,對客戶端是可見的幌蚊,可被客戶端窺探、復制溃卡、修改溢豆。而Session存儲在服務器上,不 存在敏感信息泄露的風險
  2 Cookie中只能保存ASCII字符串瘸羡,Session中可以保存任意類型的數(shù)據(jù)
  3 有效期不同漩仙。Cookie的過期時間可以被設置很長。只要關閉了瀏覽器窗口,該Session就會過期讯赏。
4 跨域支持不同垮兑。Cookie支持跨域訪問(設置domain屬性實現(xiàn)跨子域),Session不支持跨域訪問

SQL語句優(yōu)化和索引優(yōu)化

SQL語句優(yōu)化
1.like語句優(yōu)化:由于abc前面用了“%”漱挎,因此該查詢必然走全表查詢系枪,除非必要,否則不要在關鍵詞前加%
2.where后面的條件順序: 連接條件放前面磕谅, 而其他的條件放后面私爷,由于sql從右側往左側執(zhí)行,此時可以過濾掉大部分數(shù)據(jù)
3.where子句使用 膊夹!= 或 <> 操作符優(yōu)化
在where子句中使用 衬浑!= 或 <>操作符,索引將被放棄使用放刨,會進行全表查詢
如SQL:SELECT id FROM A WHERE ID != 5 優(yōu)化成:SELECT id FROM A WHERE ID>5 OR ID<5
4.where子句中索引列使用 IS NULL 或 IS NOT NULL 的優(yōu)化
在where子句中索引列使用 IS NULL 或 IS NOT NULL 判斷工秩,索引將被放棄使用,會進行全表查詢进统。非索引列不影響
如SQL:SELECT id FROM A WHERE num IS NULL 優(yōu)化成num上設置默認值0助币,確保表中num沒有null值,然后SQL為:SELECT id FROM A WHERE num=0
5.where子句使用or的優(yōu)化
  很多時候使用union all 或 union(必要的時候)的方式替換“or”會得到更好的效果螟碎。where子句中使用了or,索引將被放棄使用眉菱。
   如SQL:SELECT id FROM A WHERE num =10 or num = 20 優(yōu)化成:SELECT id FROM A WHERE num = 10 union all SELECT id FROM A WHERE num=20
6.任何地方都不要用 select * from table ,用具體的字段列表替換"*"掉分,不要返回用不到的字段
7.where字句里不要用函數(shù)判斷

索引優(yōu)化
1俭缓、表的主鍵、外鍵必須有索引酥郭;
2华坦、數(shù)據(jù)量超過300的表應該有索引;
3不从、經(jīng)常與其他表進行連接的表惜姐,在連接字段上應該建立索引;
4消返、索引應該建在選擇性高的字段上载弄;
5耘拇、頻繁進行數(shù)據(jù)操作的表撵颊,不要建立太多的索引;
6惫叛、刪除無用的索引倡勇,避免對執(zhí)行計劃造成負面影響;

如何設計一個高并發(fā)的系統(tǒng)

① 數(shù)據(jù)庫的優(yōu)化,包括合理的事務隔離級別妻熊、SQL語句優(yōu)化夸浅、索引的優(yōu)化
② 使用緩存,盡量減少數(shù)據(jù)庫 IO
③ 分布式數(shù)據(jù)庫扔役、分布式緩存
④ 服務器的負載均衡

分治法與動態(tài)規(guī)劃

分治法所能解決的問題的一般有以下的特征:
(1)該問題的規(guī)姆縮小到一定的程度就可以容易解決(絕大多數(shù)的問題都滿足)
(2)該問題是可以分解為若干個規(guī)模較小的相同的問題,即改問題具有最優(yōu)子結構性質(zhì)(前提亿胸,也是絕大多數(shù)的問題都滿足的)
(3)利用該問題分解出的字問題的解可以合并該問題(關鍵)
(4)該問題分解出來的各個子問題是相互獨立的(分治法的效率)
(如果具備一二條坯钦,但不具備第三條,可以考慮使用貪心算法或動態(tài)規(guī)劃)

動態(tài)規(guī)劃
1.簡單的說就是在解決多階決策的過程中動態(tài)的選擇最優(yōu)的過程的方法就是動態(tài)規(guī)劃侈玄。
2.與分治法的區(qū)別:一般來說子問題不是互相獨立的婉刀,可以理解為是分治法的一種改進,不需要求解已有解的子問題(已有解的子問題用表來記錄)
3.適用條件:
(1)最優(yōu)化原理(最優(yōu)子結構):一個最優(yōu)策略的子策略總是最優(yōu)的---->局部最優(yōu)序仙,整體最優(yōu)
(2)無后效性:每個狀態(tài)都是過去歷史的一個完整的總結
(3)子問題的重疊性:高效性
例子:子序列最大和問題突颊,滑雪問題

貪心算法
條件:每一步的最優(yōu)解一定依賴上一步的最優(yōu)解。
方法:從問題的某一個初始解出發(fā)逐步逼近給定的目標潘悼,以盡可能快的地求得更好的解律秃。當達到某算法中的某一步不能再繼續(xù)前進時,算法停止挥等。
存在問題:
(1)不能保證求得的最后解是最佳的友绝;
(2)不能用來求最大最小解的問題;比如錢幣分為1元3元4元肝劲,要拿6元錢迁客,貪心的話,先拿4辞槐,再拿兩個1掷漱,一共3張錢;實際最優(yōu)卻是兩張3元就夠了榄檬。
“貪心”特性:它對解空間樹的遍歷不需要自底向上卜范,而只需要自根開始,選擇最優(yōu)的路鹿榜,一直走到底就可以了海雪。這樣,與動態(tài)規(guī)劃相比舱殿,它的代價只取決于子問題的數(shù)目奥裸,而選擇數(shù)目總為1。
例子:哈夫曼樹沪袭,錢幣組合湾宙,設置雷達問題

關系數(shù)據(jù)庫的第一第二第三范式?

1NF是所有關系型數(shù)據(jù)庫的最基本要求,滿足這個要求才能創(chuàng)建數(shù)據(jù)表侠鳄;
2NF:消除了非主屬性對于碼的部分函數(shù)依賴埠啃;
假如當 K 確定的情況下,該表除 K 之外的所有屬性的值也就隨之確定伟恶,那么 K 就是碼
3NF:消除了非主屬性對于碼的傳遞函數(shù)依賴碴开。

設計模式

工廠方法模式:spring中創(chuàng)建實例時配置Factorybean(動態(tài)工廠bean)
抽象工廠模式:工廠方法模式中每個工廠類只能創(chuàng)建一個具體產(chǎn)品類的實例,抽象工廠模式每個具體工廠類可以創(chuàng)建多個具體產(chǎn)品類的實例
單例模式:spring中的bean默認是單例的
適配器模式:AOP中advisor鏈需要MethodIntercepter對象博秫,所以每一個advisor中的advice都要適配成對應的methodInterceptor對象
裝飾模式:spring中類名有wrapper,decorator叹螟,動態(tài)給對象添加額外的職責
注意:在裝飾器模式中,裝飾者和被裝飾者必須有共同的父類台盯;一般情況下罢绽,被裝飾者中有裝飾者(或者他們共同的父類)的引用,通過構造函數(shù)來實現(xiàn)
代理模式:AOP中JDK動態(tài)代理和CGlib代理
觀察者模式:spring中常用地方是listener的實現(xiàn)
策略模式:spring的事務管理策略静盅,只提供事務管理接口

JDK源碼中的設計模式
裝飾者模式:動態(tài)的給一個對象附加額外的功能良价,這也是子類的一種替代方式,IO中蒿叠。
代理模式:遠程方法調(diào)用RMI
迭代器模式:Iterator
觀察者模式:Listener,它使得一個對象可以靈活的將消息發(fā)送給感興趣的對象

快排思想

選定一個切分元素明垢,將比這個數(shù)大的數(shù)放到右邊,小于或等于它的數(shù)放到左邊市咽,再對左右區(qū)間遞歸痊银,采用分治策略。

DNS解析過程

175333937.jpg

dns解析.PNG

1施绎、在瀏覽器中輸入www.qq.com域名溯革,操作系統(tǒng)會先檢查自己瀏覽器DNS緩存,然后是本地的hosts文件是否有這個網(wǎng)址映射關系谷醉,如果有致稀,就先調(diào)用這個IP地址映射,完成域名解析俱尼。
2抖单、如果hosts里沒有這個域名的映射,則查找本地DNS解析器緩存遇八,是否有這個網(wǎng)址映射關系矛绘,如果有,直接返回刃永,完成域名解析货矮。
3、如果hosts與本地DNS解析器緩存都沒有相應的網(wǎng)址映射關系揽碘,首先會找TCP/ip參數(shù)中設置的首選DNS服務器次屠,在此我們叫它本地DNS服務器,此服務器收到查詢時雳刺,如果要查詢的域名劫灶,包含在本地配置區(qū)域資源中,則返回解析結果給客戶機掖桦,完成域名解析本昏,此解析具有權威性。
4枪汪、如果要查詢的域名涌穆,不由本地DNS服務器區(qū)域解析,但該服務器已緩存了此網(wǎng)址映射關系雀久,則調(diào)用這個IP地址映射宿稀,完成域名解析,此解析不具有權威性赖捌。
5祝沸、如果本地DNS服務器本地區(qū)域文件與緩存解析都失效,則根據(jù)本地DNS服務器的設置(是否設置轉(zhuǎn)發(fā)器)進行查詢越庇,如果未用轉(zhuǎn)發(fā)模式罩锐,本地DNS就把請求發(fā)至13臺根DNS,根DNS服務器收到請求后會判斷這個域名(.com)是誰來授權管理卤唉,并會返回一個負責該頂級域名服務器的一個IP涩惑。本地DNS服務器收到IP信息后,將會聯(lián)系負責.com域的這臺服務器桑驱。這臺負責.com域的服務器收到請求后竭恬,如果自己無法解析,它就會找一個管理.com域的下一級DNS服務器地址(qq.com)給本地DNS服務器熬的。當本地DNS服務器收到這個地址后萍聊,就會找qq.com域服務器,重復上面的動作悦析,進行查詢寿桨,直至找到www.qq.com主機。
6强戴、如果用的是轉(zhuǎn)發(fā)模式牺弹,此DNS服務器就會把請求轉(zhuǎn)發(fā)至上一級DNS服務器睁冬,由上一級服務器進行解析,上一級服務器如果不能解析,或找根DNS或把轉(zhuǎn)請求轉(zhuǎn)至上上級偶房,以此循環(huán)。不管是本地DNS服務器用是是轉(zhuǎn)發(fā)恤溶,還是根提示回窘,最后都是把結果返回給本地DNS服務器翘县,由此DNS服務器再返回給客戶機。
從客戶端到本地DNS服務器是屬于遞歸查詢谴分,而DNS服務器之間的交互查詢就是迭代查詢锈麸。

TCP/UDP的區(qū)別?TCP協(xié)議如何保證可靠傳輸?

區(qū)別
1.基于連接與無連接
2.TCP要求系統(tǒng)資源較多,UDP較少牺蹄;
3.UDP程序結構較簡單
4.流模式(TCP)與數(shù)據(jù)報模式(UDP);
5.TCP保證數(shù)據(jù)正確性忘伞,UDP可能丟包
6.TCP保證數(shù)據(jù)順序,UDP不保證

TCP協(xié)議如何保證可靠傳輸:
1沙兰、應用數(shù)據(jù)被分割成TCP認為最適合發(fā)送的數(shù)據(jù)塊氓奈。
2、超時重傳:當TCP發(fā)出一個段后鼎天,它啟動一個定時器舀奶,等待目的端確認收到這個報文段。如果不能及時收到一個確認斋射,將重發(fā)這個報文段伪节。
3、TCP給發(fā)送的每一個包進行編號绩鸣,接收方對數(shù)據(jù)包進行排序怀大,把有序數(shù)據(jù)傳送給應用層。
4呀闻、校驗和:TCP將保持它首部和數(shù)據(jù)的檢驗和化借。這是一個端到端的檢驗和,目的是檢測數(shù)據(jù)在傳輸過程中的任何變化捡多。如果收到段的檢驗和有差錯蓖康,TCP將丟棄這個報文段和不確認收到此報文段。
5垒手、TCP的接收端會丟棄重復的數(shù)據(jù)蒜焊。
6、流量控制:TCP連接的每一方都有固定大小的緩沖空間科贬,TCP的接收端只允許發(fā)送端發(fā)送接收端緩沖區(qū)能接納的我數(shù)據(jù)泳梆。當接收方來不及處理發(fā)送方的數(shù)據(jù),能提示發(fā)送方降低發(fā)送的速率榜掌,防止包丟失优妙。TCP使用的流量控制協(xié)議是可變大小的滑動窗口協(xié)議。
7憎账、擁塞控制:當網(wǎng)絡擁塞時套硼,減少數(shù)據(jù)的發(fā)送。

1.靜態(tài)代碼塊和非靜態(tài)代碼塊的區(qū)別

靜態(tài)代碼塊在非靜態(tài)代碼塊之前執(zhí)行(靜態(tài)代碼塊—>非靜態(tài)代碼塊—>構造方法)靜態(tài)代碼塊只在第一次new執(zhí)行一次胞皱,之后不再執(zhí)行邪意,而非靜態(tài)代碼塊在每new一次就執(zhí)行一次九妈。非靜態(tài)代碼塊可在普通方法中定義(不過作用不大);而靜態(tài)代碼塊不行雾鬼。

2.hashmap進行擴容萌朱,底層結構

hashmap底層結構是數(shù)組+鏈表,Entry 實際上就是一個單向鏈表。采用鏈地址法解決hash沖突呆贿,沒有沖突的理想情況下增加和刪除的時間復雜度都是O(1)

那么hashmap什么時候進行擴容呢?當hashmap中的元素個數(shù)超過數(shù)組大小乘以loadFactor時森渐,就會進行數(shù)組擴容做入,loadFactor的默認值為0.75,也就是說同衣,默認情況下竟块,數(shù)組大小為16,那么當hashmap中元素個數(shù)超過16乘以0.75=12的時候耐齐,就把數(shù)組的大小擴展為2乘以16=32浪秘,即擴大一倍,這里就是使用一個容量更大的數(shù)組來代替已有的容量小的數(shù)組埠况,transfer()方法將原有Entry數(shù)組的元素拷貝到新的Entry數(shù)組里耸携。然后重新計算每個元素在數(shù)組中的位置,而這是一個非常消耗性能的操作辕翰,所以如果我們已經(jīng)預知hashmap中元素的個數(shù)夺衍,那么預設元素的個數(shù)能夠有效的提高hashmap的性能。比如說喜命,我們有1000個元素new HashMap(1000), 但是理論上來講new HashMap(1024)更合適沟沙,不過上面annegu已經(jīng)說過,即使是1000壁榕,hashmap也自動會將其設置為1024矛紫。 但是new HashMap(1024)還不是更合適的,因為0.75乘以1000 < 1000, 也就是說為了讓0.75 乘以 size > 1000, 我們必須這樣new HashMap(2048)才最合適牌里,既考慮了&的問題颊咬,也避免了resize的問題。

3.內(nèi)存泄漏

內(nèi)存泄露的定義:對于應用程序來說牡辽,當對象已經(jīng)不再被使用贪染,但是Java的垃圾回收器不能回收它們的時候,就產(chǎn)生了內(nèi)存泄露催享。

為什么內(nèi)存泄露會發(fā)生::

讓我們用下面的例子來看看為什么會發(fā)生內(nèi)存泄露杭隙。如下圖所示,對象A引用對象B因妙,A的生命周期(t1-t4)比B的生命周期(t2-t3)要長痰憎,當B在程序中不再被使用的時候票髓,A仍然引用著B。在這種情況下铣耘,垃圾回收器是不會回收B對象的洽沟,這就可能造成了內(nèi)存不足問題,因為A可能不止引用著B對象蜗细,還可能引用其它生命周期比A短的對象裆操,這就造成了大量無用對象不能被回收,且占據(jù)了昂貴的內(nèi)存資源炉媒。

同樣的踪区,B對象也可能引用著一大堆對象,這些被B對象引用著的對象也不能被垃圾回收器回收吊骤,所有的這些無用對象消耗了大量內(nèi)存資源缎岗。

怎樣阻止內(nèi)存泄露

1.使用List、Map等集合時白粉,在使用完成后賦值為null

2.使用大對象時传泊,在用完后賦值為null

3.目前已知的jdk1.6的substring()方法會導致內(nèi)存泄露

4.避免一些死循環(huán)等重復創(chuàng)建或?qū)咸砑釉兀瑩伪瑑?nèi)存

5.簡潔數(shù)據(jù)結構鸭巴、少用靜態(tài)集合等

6.及時的關閉打開的文件眷细,socket句柄等

7.多關注事件監(jiān)聽(listeners)和回調(diào)(callbacks),比如注冊了一個listener鹃祖,當它不再被使用的時候薪鹦,忘了注銷該listener,可能就會產(chǎn)生內(nèi)存泄露

4.樂觀鎖和悲觀鎖

悲觀鎖:假定會發(fā)生并發(fā)沖突惯豆,屏蔽一切可能違反數(shù)據(jù)完整性的操作池磁。[1]

樂觀鎖:假設不會發(fā)生并發(fā)沖突,只在提交操作時檢查是否違反數(shù)據(jù)完整性楷兽。[1] 樂觀鎖不能解決臟讀的問題地熄。

樂觀鎖

大多使用數(shù)據(jù)版本(Version)記錄機制實現(xiàn),一般是通過為數(shù)據(jù)庫表增加一個數(shù)字類型的 “version” 字段來實現(xiàn)芯杀。當讀取數(shù)據(jù)時端考,將version字段的值一同讀出,數(shù)據(jù)每更新一次揭厚,對此version值加一却特。當我們提交更新的時候,判斷數(shù)據(jù)庫表對應記錄的當前版本信息與第一次取出來的version值進行比對筛圆,如果數(shù)據(jù)庫表當前版本號與第一次取出來的version值相等裂明,則予以更新,否則認為是過期數(shù)據(jù)

悲觀鎖

需要使用數(shù)據(jù)庫的鎖機制太援,比如SQL SERVER 的TABLOCKX(排它表鎖) 此選項被選中時闽晦,SQL Server 將在整個表上置排它鎖直至該命令或事務結束扳碍。這將防止其他進程讀取或修改表中的數(shù)據(jù)。

使用:在實際生產(chǎn)環(huán)境里邊,如果并發(fā)量不大且不允許臟讀仙蛉,可以使用悲觀鎖解決并發(fā)問題笋敞;但如果系統(tǒng)的并發(fā)非常大的話,悲觀鎖定會帶來非常大的性能問題,所以我們就要選擇樂觀鎖定的方法.

5.數(shù)據(jù)庫索引(b tree,b+tree)

B樹即多路平衡查找樹荠瘪,一個 m 階的B樹滿足以下條件:

  1. 每個結點至多擁有m棵子樹夯巷;
  2. 根結點至少擁有兩顆子樹(存在子樹的情況下);
  3. 除了根結點以外哀墓,其余每個分支結點至少擁有 m/2 棵子樹趁餐;
  4. 所有的葉結點都在同一層上;
  5. 有 k 棵子樹的分支結點則存在 k-1 個關鍵字麸祷,關鍵字按照遞增次序進行排列澎怒;

B+樹的特性:
1.所有關鍵字都出現(xiàn)在葉子結點的鏈表中(稠密索引)褒搔,且鏈表中的關鍵字恰好是有序的阶牍;
2.不可能在非葉子結點命中;
3.非葉子結點相當于是葉子結點的索引(稀疏索引)星瘾,葉子結點相當于是存儲(關鍵字)數(shù)據(jù)的數(shù)據(jù)層走孽;
4.更適合文件索引系統(tǒng);

6.Maven生命周期

Maven有三套相互獨立的生命周期琳状,請注意這里說的是“三套”磕瓷,而且“相互獨立”,初學者容易將Maven的生命周期看成一個整體念逞,其實不然困食。這三套生命周期分別是:

Clean Lifecycle 在進行真正的構建之前進行一些清理工作。

Default Lifecycle 構建的核心部分翎承,編譯硕盹,測試,打包叨咖,部署等等瘩例。

Site Lifecycle 生成項目報告,站點甸各,發(fā)布站點垛贤。

我再次強調(diào)一下它們是相互獨立的,你可以僅僅調(diào)用clean來清理工作目錄趣倾,僅僅調(diào)用site來生成站點聘惦。當然你也可以直接運行 mvn clean install site 運行所有這三套生命周期。

7儒恋、HashMap與HashTable有什么區(qū)別部凑?對比Hashtable VS HashMap

兩者都是用key-value方式獲取數(shù)據(jù)露乏。Hashtable是原始集合類之一(也稱作遺留類)。HashMap作為新集合框架的一部分在Java2的1.2版本中加入涂邀。它們之間有一下區(qū)別:

  • HashMap和Hashtable大致是等同的瘟仿,除了非同步和空值(HashMap允許null值作為key和value,而Hashtable不可以)比勉。
  • HashMap沒法保證映射的順序一直不變劳较,但是作為HashMap的子類LinkedHashMap,如果想要預知的順序迭代(默認按照插入順序)浩聋,你可以很輕易的置換為HashMap观蜗,如果使用Hashtable就沒那么容易了。
  • HashMap不是同步的衣洁,而Hashtable是同步的墓捻。
  • 迭代HashMap采用快速失敗機制,而Hashtable不是坊夫,所以這是設計的考慮點砖第。

java的快速失敗和安全失敗

快速失敗:java.util包下的集合類都是快速失敗的环凿,不能在多線程下發(fā)生并發(fā)修改
安全失斘嗉妗:java.util.concurrent包下的容器都是安全失敗,可以在多線程下并發(fā)使用智听,并發(fā)修改羽杰。

8、在Hashtable上下文中同步是什么意思到推?

同步意味著在一個時間點只能有一個線程可以修改哈希表考赛,任何線程在執(zhí)行hashtable的更新操作前需要獲取對象鎖,其他線程等待鎖的釋放莉测。

9颜骤、怎樣使Hashmap同步?

HashMap可以通過Map m = Collections.synchronizedMap(hashMap)來達到同步的效果悔雹。

10复哆、什么時候使用Hashtable,什么時候使用HashMap

基本的不同點是Hashtable同步HashMap不是的腌零,所以無論什么時候有多個線程訪問相同實例的可能時梯找,就應該使用Hashtable,反之使用HashMap益涧。非線程安全的數(shù)據(jù)結構能帶來更好的性能锈锤。

如果在將來有一種可能—你需要按順序獲得鍵值對的方案時,HashMap是一個很好的選擇,因為有HashMap的一個子類 LinkedHashMap久免。所以如果你想可預測的按順序迭代(默認按插入的順序)浅辙,你可以很方便用LinkedHashMap替換HashMap。反觀要是使用的Hashtable就沒那么簡單了阎姥。同時如果有多個線程訪問HashMap记舆,Collections.synchronizedMap()可以代替,總的來說HashMap更靈活呼巴。

11泽腮、為什么Vector類認為是廢棄的或者是非官方地不推薦使用?或者說為什么我們應該一直使用ArrayList而不是Vector

你應該使用ArrayList而不是Vector是因為默認情況下你是非同步訪問的衣赶,Vector同步了每個方法诊赊,你幾乎從不要那樣做,通常有想要同步的是整個操作序列府瞄。同步單個的操作也不安全(如果你迭代一個Vector碧磅,你還是要加鎖,以避免其它線程在同一時刻改變集合).而且效率更慢遵馆。當然同樣有鎖的開銷即使你不需要鲸郊,這是個很糟糕的方法在默認情況下同步訪問。你可以一直使用Collections.sychronizedList來裝飾一個集合团搞。

事實上Vector結合了“可變數(shù)組”的集合和同步每個操作的實現(xiàn)严望。這是另外一個設計上的缺陷多艇。Vector還有些遺留的方法在枚舉和元素獲取的方法逻恐,這些方法不同于List接口,如果這些方法在代碼中程序員更趨向于想用它峻黍。盡管枚舉速度更快复隆,但是他們不能檢查如果集合在迭代的時候修改了,這樣將導致問題姆涩。盡管以上諸多原因挽拂,oracle也從沒宣稱過要廢棄Vector。

12.Concurrenthashmap的細節(jié)

Hashtable中采用的鎖機制synchronizedmap是一次鎖住整個hash表骨饿,從而同一時刻只能由一個線程對其進行操作亏栈;而Concurrenthashmap中則是一次鎖住一個桶,Concurrenthashmap默認將hash表分為16個桶宏赘,諸如get,put,remove等操作值鎖當前需要用到的桶绒北,原來只有一個線程進入,現(xiàn)在卻能同時有16個寫線程執(zhí)行察署,并發(fā)性能大大提升闷游。ConcurrentHashMap是由Segment數(shù)組結構和HashEntry數(shù)組結構組成。Segment是一種可重入鎖ReentrantLock,在ConcurrentHashMap里扮演鎖的角色脐往,HashEntry則用于存儲鍵值對數(shù)據(jù)休吠。一個ConcurrentHashMap里包含一個Segment數(shù)組,Segment的結構和HashMap類似业簿,是一種數(shù)組和鏈表結構瘤礁, 一個Segment里包含一個HashEntry數(shù)組,每個HashEntry是一個鏈表結構的元素梅尤, 每個Segment守護者一個HashEntry數(shù)組里的元素,當對HashEntry數(shù)組的數(shù)據(jù)進行修改時蔚携,必須首先獲得它對應的Segment鎖


concurrenthashmap.PNG

13.進程和線程

進程是資源分配的基本單位,表示一個程序的運行活動,線程是調(diào)度的基本單位肺素,是進程中不同執(zhí)行路徑弦悉。進程包含線程,線程共用進程資源亡脑。

14.Java內(nèi)存模型是什么?

Java內(nèi)存模型規(guī)定了所有的變量都存儲在主內(nèi)存(Main Memory)中邀跃。每條線程還有自己的工作內(nèi)存( Working Memory)霉咨。線程的工作內(nèi)存中保存了被該線程使用到的變量的主內(nèi)存副本拷貝,線程對變量的所有操作(讀取拍屑、賦值等)都必須在工作內(nèi)存中進行途戒,而不能自接讀寫主內(nèi)存中的變量。不同的線程之間也無法直接訪問對方工作內(nèi)存中的變量僵驰,線程間變量值的傳遞均需要通過主內(nèi)存來完成喷斋。
Java內(nèi)存模型對一個線程所做的變動能被其它線程可見提供了保證,它們之間是先行發(fā)生關系蒜茴。包含了:
1.線程內(nèi)的代碼能夠按先后順序執(zhí)行星爪,這被稱為程序次序規(guī)則。
2.對于同一個鎖粉私,一個解鎖操作一定要發(fā)生在時間上后發(fā)生的另一個鎖定操作之前顽腾,也叫做管程鎖定規(guī)則。
3.前一個對volatile的寫操作在后一個volatile的讀操作之前诺核,也叫volatile變量規(guī)則抄肖。
4.一個線程內(nèi)的任何操作必需在這個線程的start()調(diào)用之后,也叫作線程啟動規(guī)則窖杀。
5.一個線程的所有操作都會在線程終止之前漓摩,線程終止規(guī)則。
6.一個對象的終結操作必需在這個對象構造完成之后陈瘦,也叫對象終結規(guī)則幌甘。
7.如果操作A先行發(fā)生于操作B潮售,操作B先行發(fā)生于操作C,就可以得出操作A先行發(fā)生于操作C锅风。
8.線程中斷規(guī)則:對線程interrupt()方法的調(diào)用先行發(fā)生于被中斷線程的代碼檢測到中斷事件的發(fā)生酥诽。

15.Thread 類中的start() 和 run() 方法有什么區(qū)別?

這個問題經(jīng)常被問到皱埠,但還是能從此區(qū)分出面試者對Java線程模型的理解程度肮帐。start()方法被用來啟動新創(chuàng)建的線程,而且start()內(nèi)部調(diào)用了run()方法边器,這和直接調(diào)用run()方法的效果不一樣训枢。當你調(diào)用run()方法的時候,只會是在原來的線程中調(diào)用忘巧,沒有新的線程啟動恒界,start()方法才會啟動新線程。

16.Java中的volatile 變量是什么砚嘴?

volatile是一個特殊的修飾符十酣,只有成員變量才能使用它,volatile關鍵字解決的是內(nèi)存可見性的問題际长,會使得所有對volatile變量的讀寫都會直接刷到主存耸采,即保證了變量的可見性。volatile變量可以保證下一個讀取操作會在前一個寫操作之后發(fā)生工育,就是上一題的volatile變量規(guī)則虾宇。

17 Java多線程中調(diào)用wait() 和 sleep()方法有什么不同?

答:sleep()方法(休眠)是線程類(Thread)的靜態(tài)方法如绸,調(diào)用此方法會讓當前線程暫停執(zhí)行指定的時間嘱朽,將執(zhí)行機會(CPU)讓給其他線程,但是對象的鎖依然保持竭沫,因此休眠時間結束后會自動恢復燥翅。wait()是Object類的方法骑篙,調(diào)用對象的wait()方法導致當前線程放棄對象的鎖(線程暫停執(zhí)行)蜕提,進入對象的等待池(wait pool),只有調(diào)用對象的notify()方法(或notifyAll()方法)時才能喚醒等待池中的線程進入等鎖池(lock pool)靶端,如果線程重新獲得對象的鎖就可以進入就緒狀態(tài)谎势。


線程狀態(tài).PNG

18.ACID

  • 原子性:一個事務(transaction)中的所有操作,要么全部完成杨名,要么全部不完成脏榆,不會結束在中間某個環(huán)節(jié)。事務在執(zhí)行過程中發(fā)生錯誤台谍,會被回滾(Rollback)到事務開始前的狀態(tài)须喂,就像這個事務從來沒有執(zhí)行過一樣。
  • 一致性:在事務開始之前和事務結束以后,數(shù)據(jù)庫的完整性沒有被破壞坞生。這表示寫入的資料必須完全符合所有的預設規(guī)則仔役,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫可以自發(fā)性地完成預定的工作是己。
  • 隔離性:數(shù)據(jù)庫允許多個并發(fā)事務同時對其數(shù)據(jù)進行讀寫和修改的能力又兵,隔離性可以防止多個事務并發(fā)執(zhí)行時由于交叉執(zhí)行而導致數(shù)據(jù)的不一致。事務隔離分為不同級別卒废,包括讀未提交(Read uncommitted)沛厨、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)摔认。
  • 持久性:事務處理結束后逆皮,對數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會丟失参袱。

19.解決hash沖突的方法

鏈地址法页屠、開放地址法(偽隨機探測法)、再散列法蓖柔、建立一個公共溢出區(qū)辰企。

20.TCP的滑動窗口機制

TCP滑動窗口技術通過動態(tài)改變窗口大小來調(diào)節(jié)兩臺主機間數(shù)據(jù)傳輸。每個TCP/IP主機支持全雙工數(shù)據(jù)傳輸况鸣,因此TCP有兩個滑動窗口:一個用于接收數(shù)據(jù)牢贸,另一個用于發(fā)送數(shù)據(jù)。TCP使用肯定確認技術镐捧,其確認號指的是下一個所期待的字節(jié)潜索。 假定發(fā)送方設備以每一次三個數(shù)據(jù)包的方式發(fā)送數(shù)據(jù),也就是說懂酱,窗口大小為3竹习。發(fā)送方發(fā)送序列號為1、2列牺、3的三個數(shù)據(jù)包整陌,接收方設備成功接收數(shù)據(jù)包,用序列號4確認瞎领。發(fā)送方設備收到確認泌辫,繼續(xù)以窗口大小3發(fā)送數(shù)據(jù)。當接收方設備要求降低或者增大網(wǎng)絡流量時九默,可以對窗口大小進行減小或者增加震放,本例降低窗口大小為2,每一次發(fā)送兩個數(shù)據(jù)包驼修。當接收方設備要求窗口大小為0殿遂,表明接收方已經(jīng)接收了全部數(shù)據(jù)诈铛,或者接收方應用程序沒有時間讀取數(shù)據(jù),要求暫停發(fā)送墨礁。發(fā)送方接收到攜帶窗口號為0的確認癌瘾,停止這一方向的數(shù)據(jù)傳輸。

21.線程池

線程池:基本思想還是一種對象池的思想饵溅,開辟一塊內(nèi)存空間妨退,里面存放了眾多(未死亡)的線程,池中線程執(zhí)行調(diào)度由池管理器來處理蜕企。當有線程任務時咬荷,從池中取一個,執(zhí)行完成后線程對象歸池轻掩,這樣可以避免反復創(chuàng)建線程對象所帶來的資源開銷幸乒,提高了系統(tǒng)的性能。

String 轉(zhuǎn)出 int型唇牧,判斷能不能轉(zhuǎn)罕扎?如何轉(zhuǎn)?

如果只是判斷是否都是數(shù)字,可以用正則表達式匹配:s.matches("-?\d+")丐重。 如果要判斷是否在int范圍內(nèi),用try catch腔召。用Integer.parseInt(s)將字符串轉(zhuǎn)為Int

講講多線程?多線程與多進程的區(qū)別

什么是多線程:1個進程中可以開啟多條線程扮惦,每條線程可以并行(同時)執(zhí)行不同的任務
多線程的優(yōu)點:能適當提高程序的執(zhí)行效率臀蛛,能適當提高資源利用率(CPU、內(nèi)存利用率)
多線程的缺點:開啟線程需要占用一定的內(nèi)存空間(默認情況下崖蜜,主線程占用1M浊仆,子線程占用512KB),如果開啟大量的線程豫领,會占用大量的內(nèi)存空間抡柿,降低程序的性能;線程越多等恐,CPU在調(diào)度線程上的開銷就越大洲劣;程序設計更加復雜:比如線程之間的通信、多線程的數(shù)據(jù)共享

兩者都可以提高程序的并發(fā)度鼠锈,提高程序運行效率和響應時間闪檬。
線程和進程在使用上各有優(yōu)缺點:線程執(zhí)行開銷小,但不利于資源管理和保護购笆;而進程正相反。同時虚循,線程適合于在SMP機器上運行同欠,而進程則可以跨機器遷移样傍。
根本區(qū)別就一點:用多進程每個進程有自己的地址空間(address space),線程則共享地址空間铺遂。所有其它區(qū)別都是由此而來的:
1衫哥。速度:線程產(chǎn)生的速度快,線程間的通訊快襟锐、切換快等撤逢,因為他們在同一個地址空間內(nèi)。
2粮坞。資源利用率:線程的資源利用率比較好也是因為他們在同一個地址空間內(nèi)蚊荣。
3。同步問題:線程使用公共變量/內(nèi)存時需要使用同步機制還是因為他們在同一個地址空間內(nèi)莫杈。

你用過的一些collection都有哪些

collection是個接口(常用作集合用)互例,它下面有兩個子接口分別為:(1)List(2)set

其中List是有序可重復集,set是無序不可重復集筝闹。

List又分為三類(1)ArrayList(2)LinkList(3)Vector
ArrayList內(nèi)部由數(shù)組實現(xiàn)媳叨,適合查詢;LinkList內(nèi)部由鏈表實現(xiàn)关顷,適合增刪改糊秆。Vector幾乎用不到
ArrayList 對于隨機位置的add/remove,時間復雜度為 O(n),但是對于列表末尾的添加/刪除操作,時間復雜度是 O(1). 對于get/set议双,時間復雜度是O(1)
LinkedList對于隨機位置的add/remove扩然,時間復雜度為 O(n),但是對于列表 末尾/開頭 的添加/刪除操作,時間復雜度是 O(1).
對于get/set,時間復雜度為O(n)
set又分為(1)HashSet(2)treeSet treeSet是二叉樹聋伦,有序的 夫偶;HashSet采用散列存儲,是無序的觉增。另外collection是集合的接口兵拢,collections是集合的工具類

treemap的實現(xiàn)?

紅黑樹逾礁。

equls 和 == 的區(qū)別

== : 它的作用是判斷兩個對象的地址是不是相等说铃。即,判斷兩個對象是不是同一個對象嘹履。

equals() : 它的作用也是判斷兩個對象是否相等腻扇。但它一般有兩種使用情況:
情況1,類沒有覆蓋equals()方法砾嫉。則通過equals()比較該類的兩個對象時幼苛,等價于通過“==”比較這兩個對象。
情況2焕刮,類覆蓋了equals()方法舶沿。一般墙杯,我們都覆蓋equals()方法來兩個對象的內(nèi)容相等;若它們的內(nèi)容相等括荡,則返回true(即高镐,認為這兩個對象相等)。

java對象序列化

把java對象轉(zhuǎn)換為字節(jié)序列畸冲,通過實現(xiàn)Serializable接口嫉髓,比如將Httpsession對象保存到文件系統(tǒng)或數(shù)據(jù)庫等

java線程間通信方式:

1.synchronized同步2.while輪詢3.wait/notify4.管道通信

堆內(nèi)存的分代回收

Java針對堆的垃圾回收,將堆分為了三個較小的部分:新生代邑闲、老年代算行。新生代主要使用復制和標記-清除垃圾回收算法,年老代主要使用標記-整理垃圾回收算法监憎,因此java虛擬中針對新生代和年老代分別提供了多種不同的垃圾收集器纱意。

重載(Overload)和重寫(Override)的區(qū)別。重載的方法能否根據(jù)返回類型進行區(qū)分鲸阔?

方法的重載和重寫都是實現(xiàn)多態(tài)的方式偷霉,區(qū)別在于前者實現(xiàn)的是編譯時的多態(tài)性,而后者實現(xiàn)的是運行時的多態(tài)性褐筛。重載發(fā)生在一個類中类少,同名的方法如果有不同的參數(shù)列表(參數(shù)類型不同、參數(shù)個數(shù)不同或者二者都不同)則視為重載渔扎;重寫發(fā)生在子類與父類之間硫狞,重寫要求子類被重寫方法與父類被重寫方法有相同的返回類型,比父類被重寫方法更好訪問晃痴,不能比父類被重寫方法聲明更多的異常(里氏代換原則)残吩。重載對返回類型沒有特殊的要求。

抽象類(abstract class)和接口(interface)有什么異同倘核?

答:抽象類和接口都不能夠?qū)嵗辏梢远x抽象類和接口類型的引用。一個類如果繼承了某個抽象類或者實現(xiàn)了某個接口都需要對其中的抽象方法全部進行實現(xiàn)紧唱,否則該類仍然需要被聲明為抽象類活尊。區(qū)別:接口比抽象類更加抽象,因為抽象類中可以定義構造器漏益,可以有抽象方法和具體方法蛹锰,而接口中不能定義構造器而且其中的方法全部都是抽象方法。使用方式上抽象類只有通過繼承被使用绰疤,接口只能通過實現(xiàn)被使用铜犬。

Java 中的final關鍵字有哪些用法?

答:(1)修飾類:表示該類不能被繼承;(2)修飾方法:表示方法不能被重寫翎苫;
(3)修飾方法參數(shù):不能改變參數(shù)的值

public void finalFunc(final int i, final Value value)

(4)修飾變量:表示變量只能一次賦值以后值不能被修改(常量)权埠。

數(shù)據(jù)類型之間的轉(zhuǎn)換:

  • 如何將字符串轉(zhuǎn)換為基本數(shù)據(jù)類型榨了?- 調(diào)用基本數(shù)據(jù)類型對應的包裝類中的方法parseXXX(String)或valueOf(String)即可返回相應基本類型煎谍;

  • 如何將基本數(shù)據(jù)類型轉(zhuǎn)換為字符串?- 一種方法是將基本數(shù)據(jù)類型與空字符串(”")連接(+)即可獲得其所對應的字符串龙屉;另一種方法是調(diào)用String 類中的valueOf()方法返回相應字符串

闡述final呐粘、finally、finalize的區(qū)別转捕。

  • final:修飾符(關鍵字)有三種用法:(1)修飾類:表示該類不能被繼承作岖;(2)修飾方法:表示方法不能被重寫;(3)修飾變量:表示變量只能一次賦值以后值不能被修改(常量)五芝。

  • finally:通常放在try…catch…的后面構造總是執(zhí)行代碼塊痘儡,這就意味著程序無論正常執(zhí)行還是發(fā)生異常,這里的代碼只要JVM不關閉都能執(zhí)行枢步,可以將釋放外部資源的代碼寫在finally塊中沉删。

  • finalize:Object類中定義的方法, finalize()方法是由垃圾收集器在銷毀對象時調(diào)用的醉途,通過重寫finalize()方法可以整理系統(tǒng)資源或者執(zhí)行其他清理工作矾瑰。

Collection和Collections的區(qū)別?

答:Collection是一個接口隘擎,它是Set殴穴、List等容器的父接口;Collections是個一個工具類货葬,提供了一系列的靜態(tài)方法來輔助容器操作采幌,這些方法包括對容器的搜索、排序震桶、線程安全化等等休傍。

代理模式

靜態(tài)代理:
1.可以做到在不修改目標對象的功能前提下,對目標功能擴展.
2.缺點:因為代理對象需要與目標對象實現(xiàn)一樣的接口,所以會有很多代理類,類太多.同時,一旦接口增加方法,目標對象與代理對象都要維護.

動態(tài)代理是指程序在整個運行過程中根本不存在目標的代理類,代理對象是由代理生成工具(如代理工廠)在程序運行時由JVM根據(jù)反射等機制動態(tài)生成的尼夺,代理對象與目標對象的代理關系在程序運行時才確立尊残。

JDK的動態(tài)代理:
1.代理對象,不需要實現(xiàn)接口,但是目標對象一定要實現(xiàn)接口,否則不能用動態(tài)代理
2.代理對象的生成,是利用JDK的API(newProxyInstance),動態(tài)的在內(nèi)存中構建代理對象(需要我們指定創(chuàng)建代理對象/目標對象實現(xiàn)的接口的類型)

CGLIB代理的生成原理是生成目標類的子類,而子類是增強過的淤堵,這個子類對象就是代理對象寝衫。所以,使用CGLIB生成動態(tài)代理拐邪,要求目標類必須能夠被繼承慰毅,即不能是final的類。Cglib包的底層是通過使用一個小而快的字節(jié)碼處理框架ASM來轉(zhuǎn)換字節(jié)碼并生成新的類.不鼓勵直接使用ASM,因為它要求你必須對JVM內(nèi)部結構包括class文件的格式和指令集都很熟悉扎阶。

Lock和synchronized的區(qū)別汹胃?

如果一個代碼塊被synchronized修飾了婶芭,當一個線程獲取了對應的鎖趟大,并執(zhí)行該代碼塊時欣簇,其他線程便只能一直等待更卒,等待獲取鎖的線程釋放鎖倦畅,而這里獲取鎖的線程釋放鎖只會有兩種情況: 1)獲取鎖的線程執(zhí)行完了該代碼塊邑狸,然后線程釋放對鎖的占有违孝;2)線程執(zhí)行發(fā)生異常泉坐,此時JVM會讓線程自動釋放鎖两入。那么如果這個獲取鎖的線程由于要等待IO或者其他原因(比如調(diào)用sleep方法)被阻塞了轨奄,但是又沒有釋放鎖孟害,其他線程便只能干巴巴地等待,就會影響程序執(zhí)行效率挪拟,因此就需要有一種機制可以不讓等待的線程一直無期限地等待下去挨务,通過Lock就可以辦到。還有一種是通過Lock使得多個線程都只是進行讀操作時玉组,線程之間不會發(fā)生沖突谎柄。并且通過Lock可以知道線程有沒有成功獲取到鎖。


lock與synchronized.png

從輸入url到頁面加載完成都發(fā)生了什么事情球切?

根據(jù)域名查找IP地址

通過三次握手與目標服務器建立TCP連接

主機通過TCP連接向服務器發(fā)起HTTP請求

服務器響應請求谷誓,返回HTTP報文

瀏覽器接收響應,根據(jù)HTTP狀態(tài)碼做出進一步的處理

瀏覽器將頁面渲染到視窗中

HTTP狀態(tài)碼

image.png

HTTP吨凑,HTTPS

http的不足:
1.通信使用明文捍歪,可能被竊聽
2.不驗證通信方身份,可能遭遇偽裝
3.無法證明報文完整性鸵钝,可能已遭篡改
Http+加密+認證+完整性保護=https
http優(yōu)點:
1.不保存用戶狀態(tài)
2.持久連接
3.管線化(可同時發(fā)多個請求)
http1.0和http1.1的區(qū)別,http2.0
1.長連接和短連接
長連接指一個TCP連接可以發(fā)送多個數(shù)據(jù)包糙臼,在TCP連接保持期間,如果沒有數(shù)據(jù)包發(fā)送恩商,需要雙方法檢測包以維持此鏈接变逃。短鏈接是指雙方由數(shù)據(jù)交互時,就建立一個連接怠堪,數(shù)據(jù)發(fā)送完成后就斷開連接揽乱。
2.http1.1提供了身份認證,狀態(tài)管理和cache緩存相關的請求頭與響應頭
http/2
HTTP/2
1.在應用層(HTTP/2)和傳輸層之間增加一個二進制分幀層粟矿,實現(xiàn)了多路復用來改進傳輸性能凰棉,實現(xiàn)低延遲和高吞吐量。
2.首部壓縮陌粹,利用靜態(tài)字典和動態(tài)字典存鍵值對撒犀,傳輸使用字符代替,并且只發(fā)送差異數(shù)據(jù),大大提高了傳輸性能或舞。
3.http/2還支持服務端推送荆姆,服務端推送是一種在客戶端請求之前發(fā)送數(shù)據(jù)的機制。

請求報文與響應報文

請求報文:請求方法+請求URL+協(xié)議版本+可選請求首部字段+內(nèi)容實體
響應報文:協(xié)議版本+狀態(tài)碼+原因短語+可選的響應首部字段+實體主體

AOP的具體實現(xiàn)映凳,配置bean?

  1. 定義業(yè)務接口與實現(xiàn)類IUserService和UserServiceImpl

  2. 定義切面POJO類:MyAspect,其中的方法將作為不同的通知方法

  3. 在POJO類上添加@Aspect注解胆筒,在類的方法上添加不同的通知注解

  4. 注冊目標對象與POJO類,以及AspectJ的自動代理

as.png
  1. 測試類中使用目標對象的id

PUT和POST魏宽?

PUT用來新增和完整更新腐泻,必須包含item所有屬性資料决乎。POST用來新增队询,可以只更新item一條屬性。

Socket編程客戶端的實現(xiàn)构诚?

  1. 建立與服務器端口的Tcp連接

  2. 想服務器端口發(fā)送請求

  3. 接收數(shù)據(jù)

  4. 關閉Socket

Redis蚌斩?redis和memcached的區(qū)別?

Redis是一個Key-Value類型的內(nèi)存數(shù)據(jù)庫
(1) 因為數(shù)據(jù)存在內(nèi)存中范嘱,所以速度快送膳,性能出色。
(2) 支持豐富數(shù)據(jù)類型丑蛤,支持string叠聋,list,set受裹,sorted set碌补,hash
(3) 支持事務,操作都是原子性棉饶,所謂的原子性就是對數(shù)據(jù)的更改要么全部執(zhí)行厦章,要么全部不執(zhí)行
(4) 豐富的特性:可用于緩存,消息照藻,按key設置過期時間袜啃,過期后將會自動刪除
(5) redis可以持久化其數(shù)據(jù)
redis和memcached的區(qū)別?
1.redis支持更豐富的數(shù)據(jù)類型
2.redis支持數(shù)據(jù)的備份幸缕,即master-slave模式的數(shù)據(jù)備份
3.redis支持持久化

關系型數(shù)據(jù)庫和非關系型數(shù)據(jù)庫群发?

非關系型數(shù)據(jù)庫的優(yōu)勢:1. 性能NOSQL是基于鍵值對的,可以想象成表中的主鍵和值的對應關系发乔,而且不需要經(jīng)過SQL層的解析熟妓,所以性能非常高。2. 可擴展性同樣也是因為基于鍵值對列疗,數(shù)據(jù)之間沒有耦合性滑蚯,所以非常容易水平擴展。關系型數(shù)據(jù)庫的優(yōu)勢:1. 復雜查詢可以用SQL語句方便的在一個表以及多個表之間做非常復雜的數(shù)據(jù)查詢。2. 事務支持使得對于安全性能很高的數(shù)據(jù)訪問要求得以實現(xiàn)

數(shù)據(jù)庫索引的作用告材?

答:創(chuàng)建索引可以大大提高系統(tǒng)的性能坤次。

1. 通過創(chuàng)建唯一性索引可以保證表中每行數(shù)據(jù)的唯一性

2. 大大加快數(shù)據(jù)庫檢索速度

3. 加速表和表之間的連接

4. 在使用分組(group by)和排序(order by)子句進行數(shù)據(jù)檢索時,同樣可以顯著減少查詢中分組和排序的時間斥赋。

JVM的內(nèi)存區(qū)域劃分缰猴?

運行時數(shù)據(jù)區(qū)通常包括這幾個部分:程序計數(shù)器(Program Counter Register)、Java虛擬機棧(VM Stack)疤剑、本地方法棧(Native Method Stack)滑绒、方法區(qū)(Method Area)、堆(Heap)隘膘。http://www.importnew.com/18961.html

Java虛擬機棧

  • 局部變量表疑故,顧名思義,想必不用解釋大家應該明白它的作用了吧弯菊。就是用來存儲方法中的局部變量(包括在方法中聲明的非靜態(tài)變量以及函數(shù)形參)纵势。對于基本數(shù)據(jù)類型的變量,則直接存儲它的值管钳,對于引用類型的變量钦铁,則存的是指向?qū)ο蟮囊谩>植孔兞勘淼拇笮≡诰幾g器就可以確定其大小了才漆,因此在程序執(zhí)行期間局部變量表的大小是不會改變的牛曹。
  • 操作數(shù)棧,想必學過數(shù)據(jù)結構中的棧的朋友想必對表達式求值問題不會陌生醇滥,棧最典型的一個應用就是用來對表達式求值黎比。想想一個線程執(zhí)行方法的過程中,實際上就是不斷執(zhí)行語句的過程腺办,而歸根到底就是進行計算的過程焰手。因此可以這么說,程序中的所有計算過程都是在借助于操作數(shù)棧來完成的怀喉。
  • 指向運行時常量池的引用书妻,因為在方法執(zhí)行的過程中有可能需要用到類中的常量,所以必須要有一個引用指向運行時常量躬拢。
  • 方法返回地址躲履,當一個方法執(zhí)行完畢之后,要返回之前調(diào)用它的地方聊闯,因此在棧幀中必須保存一個方法返回地址工猜。

本地方法棧
本地方法棧與Java棧的作用和原理非常相似。區(qū)別只不過是Java棧是為執(zhí)行Java方法服務的菱蔬,而本地方法棧則是為執(zhí)行本地方法(Native Method)服務的篷帅。在JVM規(guī)范中史侣,并沒有對本地方發(fā)展的具體實現(xiàn)方法以及數(shù)據(jù)結構作強制規(guī)定,虛擬機可以自由實現(xiàn)它魏身。在HotSopt虛擬機中直接就把本地方法棧和Java棧合二為一惊橱。

方法區(qū)
方法區(qū)在JVM中也是一個非常重要的區(qū)域,它與堆一樣箭昵,是被線程共享的區(qū)域税朴。在方法區(qū)中,存儲了每個類的信息(包括類的名稱家制、方法信息正林、字段信息)、靜態(tài)變量颤殴、常量以及編譯器編譯后的代碼等觅廓。
在Class文件中除了類的字段、方法诅病、接口等描述信息外哪亿,還有一項信息是常量池,用來存儲編譯期間生成的字面量和符號引用贤笆。
在方法區(qū)中有一個非常重要的部分就是運行時常量池,它是每一個類或接口的常量池的運行時表示形式讨阻,在類和接口被加載到JVM后芥永,對應的運行時常量池就被創(chuàng)建出來。當然并非Class文件常量池中的內(nèi)容才能進入運行時常量池钝吮,在運行期間也可將新的常量放入運行時常量池中埋涧,比如String的intern方法。


Java中的堆是用來存儲對象本身的以及數(shù)組

JVM調(diào)優(yōu)

1.依賴應用程序?qū)ο笊芷诜植荚O置年輕代和老年代奇瘦,如果存在大量臨時對象棘催,選擇更大的年輕代,如果存在較多的持久對象耳标,老年代適當增大
2.為老年代選擇并行收集算法

bean除了單例還有什么實現(xiàn)醇坝?

另一種和singleton對應的scope值---prototype多實例模式,調(diào)用getBean時,就new一個新實例

Linux常用命令次坡?

Cd:進入目錄

Ls :查看目錄中的文件

Mkdir : 創(chuàng)建目錄

Rm : 刪除文件或目錄

Cp : 復制一個文件

Cat more less :顯示文件內(nèi)容呼猪,more提供分頁,less提供翻頁砸琅,跳轉(zhuǎn)宋距,查找

Pwd :顯示當前路徑

Top :顯示進程資源占用情況

Cmp :查看兩個文件內(nèi)容是否一致

畫紅黑樹?

紅黑樹性質(zhì):1.每個節(jié)點是紅色或黑色2.根節(jié)點是黑色3.葉節(jié)點(NIL)是黑色4.每個紅色節(jié)點的兩個子節(jié)點都是黑色5.每個節(jié)點到其所有后代葉節(jié)點的簡單路徑上症脂,均包含數(shù)目相同的黑色節(jié)點谚赎。

原理:http://blog.csdn.net/u014634338/article/details/78007490

實現(xiàn):http://blog.csdn.net/liuweiyuxiang/article/details/78828313

各種排序的應用場景淫僻?

  • 穩(wěn)定性比較
    插入排序、冒泡排序壶唤、二叉樹排序嘁傀、二路歸并排序及其他線形排序是穩(wěn)定的。
    選擇排序视粮、希爾排序细办、快速排序、堆排序是不穩(wěn)定的蕾殴。
  • 時間復雜性比較
    插入排序笑撞、冒泡排序最優(yōu)為O(n),最壞為O(n^2), 平均O(n^2);
    快速排序最優(yōu)為O(nlogn),最壞為O(n^2),平均O(nlogn);
    堆排序最優(yōu)為O(nlogn),最壞為O(nlogn),平均O(nlogn);線形排序的時間復雜性為O(n)钓觉。
  • 輔助空間的比較
    線形排序茴肥、歸并排序的輔助空間為O(n),快速排序的輔助空間為O(logn),其它排序的輔助空間為O(1)。
  • 其它比較
    插入荡灾、冒泡排序的速度較慢瓤狐,但參加排序的序列局部或整體有序時,這種排序能達到較快的速度批幌。
    反而在這種情況下础锐,快速排序慢了。 當n較小時荧缘,對穩(wěn)定性不作要求時宜用選擇排序皆警,對穩(wěn)定性有要求時宜用插入或冒泡排序。
  • 若待排序的記錄的關鍵字在一個明顯有限范圍內(nèi)時,且空間允許時用桶排序截粗。
  • 當n較大時信姓,關鍵字元素比較隨機,對穩(wěn)定性沒要求宜用快速排序绸罗。
  • 當n較大時意推,關鍵字元素可能出現(xiàn)本身是有序的,對穩(wěn)定性有要求時珊蟀,空間允許的情況下宜用歸并排序菊值。
  • 當n較大時,關鍵字元素可能出現(xiàn)本身是有序的系洛,對穩(wěn)定性沒有要求時宜用堆排序俊性。

Spring mvc的DispatcherServlet工作機制?


1.瀏覽器將請求發(fā)送給中央處理器
2.中央處理器將請求轉(zhuǎn)給處理器映射器處理
3.處理器映射器會根據(jù)請求找到處理該請求的處理器描扯,并將其封裝為處理器執(zhí)行鏈后返回給中央調(diào)度器
4.中央調(diào)度器根據(jù)處理器執(zhí)行鏈中的處理器定页,找到能夠執(zhí)行該處理器的處理器適配器
5.處理器適配器調(diào)用執(zhí)行處理器
6.處理器將執(zhí)行結果及要跳轉(zhuǎn)的視圖封裝到ModelAndView中,并將其返回給處理器適配器
7.處理器適配器直接將結果返回給中央調(diào)度器
8.中央調(diào)度器調(diào)用視圖解析器绽诚,將ModelAndView中的視圖名稱封裝為視圖對象
9.視圖解析器將試圖對象返回給中央調(diào)度器
10.中央調(diào)度器調(diào)用視圖對象典徊,讓其自己進行渲染杭煎,形成相應對象
11.中央調(diào)度器響應瀏覽器

數(shù)據(jù)庫事務,事務隔離級別

事務是指用戶定義的一個數(shù)據(jù)庫操作序列卒落,這些操作要么全做要么全不做羡铲,是一個不可分割的工作單位。

隔離級別:read uncommitted儡毕、read committed也切、repeatable read(可重讀)、serializable(串行化)
我們將事務隔離級別設置為read uncommitted腰湾,即便是事務沒有commit雷恃,但是我們?nèi)匀荒茏x到未提交的數(shù)據(jù),這是所有隔離級別中最低的一種费坊。我們叫臟讀
當我們將當前會話的隔離級別設置為read committed的時候倒槐,當前會話只能讀取到其他事務提交的數(shù)據(jù),未提交的數(shù)據(jù)讀不到附井。那就是我們在會話B同一個事務中讨越,讀取到兩次不同的結果。這就造成了不可重復讀永毅。
當我們將當前會話的隔離級別設置為repeatable read(---MySQL默認的隔離級別)的時候把跨,當前會話可以重復讀,就是每次讀取的結果集都相同卷雕,而不管其他事務有沒有提交节猿。數(shù)據(jù)已經(jīng)發(fā)生改變,但是我還是要保持一致漫雕。這種現(xiàn)象叫幻讀。
當我們將當前會話的隔離級別設置為serializable的時候峰鄙,其他會話對該表的寫操作將被掛起浸间。可以看到吟榴,這是隔離級別中最嚴格的魁蒜,但是這樣做勢必對性能造成影響。
http://www.reibang.com/p/4e3edbedb9a8

git常用命令

git init 本地初始化倉庫git clone 獲取遠程倉庫內(nèi)容git status 查詢倉庫狀態(tài)git log 顯示分支的提交記錄git add 會遞歸地添加當前工作目錄中的所有文件git commit 提交已經(jīng)被add進來的改動

https://www.cnblogs.com/my--sunshine/p/7093412.html

對象是否存活

1.引用計數(shù)法
2.可達性分析吩翻、
java中可作為GCroot的對象有:
1.VM棧中引用的對象
2.本地方法棧中引用的對象
3.方法區(qū)中常量引用的對象
4.方法區(qū)中靜態(tài)屬性引用的對象

IoC 和 DI的區(qū)別?IoC的好處兜看?

IoC 控制反轉(zhuǎn),指將對象的創(chuàng)建權狭瞎,反轉(zhuǎn)到Spring容器 细移, DI 依賴注入,指Spring創(chuàng)建對象的過程中熊锭,將對象依賴屬性通過配置進行注入

BeanFactory 接口和 ApplicationContext 接口有什么區(qū)別 弧轧?

ApplicationContext 接口繼承BeanFactory接口雪侥,Spring核心工廠是BeanFactory ,BeanFactory采取延遲加載,第一次getBean時才會初始化Bean, ApplicationContext是會在加載配置文件時初始化Bean精绎。
ApplicationContex接口對BeanFactory(是一個子接口)進行了擴展速缨,在BeanFactory的基礎上添加了其他功能,比如與Spring的AOP更容易集成代乃,也提供支持國際化的文本消息旬牲、事件傳播以及應用層的特別配置,比如針對Web應用的WebApplicationContext搁吓。
IoC的好處在于原茅,最大限度地降低對象之間的耦合度,把對象的創(chuàng)建擎浴、和對象的依賴關系控制權都交給了spring员咽,這樣,要發(fā)生更改時贮预,只需修改一下配置就好了

bean的配置實例化有哪些方式贝室?

1) 無參構造器實例化(默認無參數(shù))
<bean id="bean1" class="cn.itcast.spring.b_instance.Bean1"></bean>
2) 靜態(tài)工廠方法實例化(簡單工廠模式)
<bean id="bean2" class="cn.itcast.spring.b_instance.Bean2Factory" factory-method="getBean2"></bean>
3) 動態(tài)工廠方法實例化(工廠方法模式)
<beanid="bean3Factory"class="cn.itcast.spring.b_instance.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>

Spring框架中Bean的生命周期和作用域

1.bean初始化
有兩種方式初始化:
A.在配置文件中通過指定init-method屬性來完成
B.實現(xiàn)InitializingBean接口
2.bean調(diào)用
有三種方式可以得到bean實例,并進行調(diào)用
3.bean銷毀
銷毀有兩種方式
A.使用配置文件指定的destroy-method屬性
B.實現(xiàn)DisposeableBean接口

作用域

singleton
當一個bean的作用域為singleton, 那么Spring IoC容器中只會存在一個共享的bean實例仿吞,并且所有對bean的請求滑频,只要id與該bean定義相匹配,則只會返回bean的同一實例唤冈。
prototype
Prototype作用域的bean會導致在每次對該bean請求(將其注入到另一個bean中峡迷,或者以程序的方式調(diào)用容器的getBean() 方法)時都會創(chuàng)建一個新的bean實例。根據(jù)經(jīng)驗你虹,對所有有狀態(tài)的bean應該使用prototype作用域绘搞,而對無狀態(tài)的bean則應該使用 singleton作用域
Request ,Session , global Session :都是一個bean定義對應一個實例。該作用域僅在基于web的Spring ApplicationContext情形下有效傅物。

spring支持Bean的注入方式夯辖?

支持構造器注入和setter方法注入
構造器注入,通過 <constructor-arg> 元素完成注入
setter方法注入董饰, 通過<property> 元素完成注入【開發(fā)中常用方式】

什么是AOP?

面向切面編程蒿褂,在面向切面編程的思想里,把功能分為核心業(yè)務功能卒暂,和周邊功能啄栓。所謂核心業(yè)務,比如登陸也祠,增刪數(shù)據(jù)昙楚,所謂周邊功能,比如日志齿坷,事務管理桂肌。周邊功能在Spring的AOP思想里数焊,即被定義為切面,在AOP的思想里崎场,核心業(yè)務功能和切面功能分別獨立進行開發(fā)佩耳,然后把切面功能和核心業(yè)務功能編織在一起,這就叫AOP.

什么時候可以用到java消息機制谭跨?

答:(1)異構系統(tǒng)集成干厚,整合現(xiàn)有資源,提高資源的利用率
(2)異步請求處理螃宙,減輕或消除系統(tǒng)瓶頸蛮瞄,提高用戶生產(chǎn)率和系統(tǒng)的整體可伸縮性
(3)組件解偶,增加系統(tǒng)的靈活性

同一個controller能否返回不同格式的數(shù)據(jù)

Mysql, Mybatis批量操作

以執(zhí)行f:\test\目錄下所有的SQL腳本為例, 其批處理代碼如下:

@echo off
for %%i in (f:\test*.sql) do (
echo excute %%i
mysql -uroot -p123456 < %%i
)
echo success
pause

若是當前目錄下, 可將”f:\test.sql” 改為”..sql” 即可

Mybatis的批處理有Union all先聯(lián)結 或者foreach批量插入

GC

對象在Eden出生谆扎,并經(jīng)過第一次minorGC后仍然存活挂捅,并能被survivor容納的話秀撇,將被移動到survivor空間中政钟,并且對象年齡設為1,對象在Survivor中沒“熬過”一次minorGC腐宋,年齡就增加1歲无蜂,當增加到一定程度(默認15歲)伺糠,就會被晉升到老年代,老年代會有majorGC斥季,未被引用的對象會被回收训桶。大對象直接進入老年代。

java類加載

類的加載指的是將類的.class文件中的二進制數(shù)據(jù)讀入到內(nèi)存中酣倾,將其放在運行時數(shù)據(jù)區(qū)的方法區(qū)內(nèi)舵揭,然后在堆區(qū)創(chuàng)建一個java.lang.Class對象,用來封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結構
類加載的過程包括了加載躁锡、驗證琉朽、準備、解析稚铣、初始化五個階段
加載時類加載過程的第一個階段,在加載階段墅垮,虛擬機需要完成以下三件事情:
1惕医、通過一個類的全限定名來獲取其定義的二進制字節(jié)流。
2算色、將這個字節(jié)流所代表的靜態(tài)存儲結構轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結構抬伺。
3、在Java堆中生成一個代表這個類的java.lang.Class對象灾梦,作為對方法區(qū)中這些數(shù)據(jù)的訪問入口峡钓。
驗證:確保被加載的類的正確性
準備:為類的靜態(tài)變量分配內(nèi)存妓笙,并將其初始化為默認值
解析:把類中的符號引用轉(zhuǎn)換為直接引用
初始化:為類的靜態(tài)變量賦予正確的初始值
雙親委派機制:雙親委派模型的工作流程是:如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類能岩,而是把請求委托給父加載器去完成寞宫,只有當父加載器在它的搜索范圍中沒有找到所需的類時,即無法完成該加載拉鹃,子加載器才會嘗試自己去加載該類辈赋。意義是防止內(nèi)存中出現(xiàn)多份同樣的字節(jié)碼。

死鎖膏燕,解決死鎖钥屈?

是指兩個或兩個以上的進程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象
死鎖的發(fā)生必須具備以下四個必要條件
互斥條件(Mutual exclusion) :資源不能被共享坝辫,只能由一個進程使用篷就。
請求與保持條件(Hold and wait):進程已獲得了一些資源,但因請求其它資源被阻塞時近忙,對已獲得的資源保持不放竭业。
不可搶占條件(No pre-emption) :有些系統(tǒng)資源是不可搶占的,當某個進程已獲得這種資源后银锻,系統(tǒng)不能強行收回永品,只能由進
程使用完時自己釋放。
循環(huán)等待條件(Circular wait) :若干個進程形成環(huán)形鏈击纬,每個都占用對方申請的下一個資源
進程已經(jīng)保持了至少一個資源鼎姐,但又提出了新的資源請求,而該資源 已被其他進程占有更振,此時請求進程被阻塞炕桨,但對自己已獲得的資源保持不放。

同步可解決死鎖:Synchronized,Lock顯示鎖肯腕,信號量控制
對待死鎖的策略主要有:
(1) 死鎖預防:破壞導致死鎖必要條件中的任意一個就可以預防死鎖献宫。例如,要求用戶申請資源時一次性申請所需要的全部資源实撒,這就破壞了保持和等待條件姊途;將資源分層,得到上一層資源后知态,才能夠申請下一層資源捷兰,它破壞了環(huán)路等待條件。預防通常會降低系統(tǒng)的效率负敏。
(2) 死鎖避免:避免是指進程在每次申請資源時判斷這些操作是否安全贡茅,例如,使用銀行家算法。死鎖避免算法的執(zhí)行會增加系統(tǒng)的開銷顶考。
(3) 死鎖檢測:死鎖預防和避免都是事前措施赁还,而死鎖的檢測則是判斷系統(tǒng)是否處于死鎖狀態(tài),如果是驹沿,則執(zhí)行死鎖解除策略艘策。
(4) 死鎖解除:這是與死鎖檢測結合使用的,它使用的方式就是剝奪甚负。即將某進程所擁有的資源強行收回柬焕,分配給其他的進程。

中間件梭域、消息隊列

中間件是在系統(tǒng)之上斑举,應用軟件之下,為處于自己上層的應用軟件提供運行與開發(fā)環(huán)境的各種組件病涨,中間件屏蔽了底層操作系統(tǒng)的復雜性富玷,是開發(fā)人員的開發(fā)環(huán)境變得簡單。

分類:1.數(shù)據(jù)訪問中間件2.遠程調(diào)用中間件3.消息隊列中間件4.對象中間件 Tomcat Jboss 都屬于中間件

消息隊列中間件主要解決
應用耦合: 訂單——庫存系統(tǒng)既穆、
異步消息: 注冊時發(fā)送短信和郵件赎懦、以及處理后序根據(jù)用戶信息的推薦工作等等
流量削峰:秒殺系統(tǒng)、
消息通訊:聊天室

https請求過程

image.png

MySql兩種存儲引擎的區(qū)別

MyISAM:

  1. 不支持事務幻工,不支持外鍵励两,支持全文索引;
  2. 支持表級鎖囊颅,即每次操作是對整個表加鎖当悔;
  3. 存儲表的總行數(shù);
  4. 一個MYISAM表有三個文件:索引文件踢代、表結構文件盲憎、數(shù)據(jù)文件;
  5. 采用非聚集索引胳挎,索引文件的數(shù)據(jù)域存儲指向數(shù)據(jù)文件的指針饼疙。輔索引與主索引基本一致,但是輔索引不用保證唯一性慕爬。
    MyISAM引擎使用的生產(chǎn)業(yè)務場景:不需要事務支持的業(yè)務窑眯,以讀為主的業(yè)務,對數(shù)據(jù)一致性要求不是很高的業(yè)務医窿。
    InnoDb:
  6. 支持ACID的事務伸但,支持事務的四種隔離級別;
  7. 支持行級鎖及外鍵約束:因此可以支持寫并發(fā)留搔;
  8. 不存儲總行數(shù);
    4.一個InnoDb引擎存儲在一個文件空間(共享表空間铛铁,表大小不受操作系統(tǒng)控制隔显,一個表可能分布在多個文件里)却妨,也有可能為多個(設置為獨立表空,表大小受操作系統(tǒng)文件大小限制括眠,一般為2G)彪标,受操作系統(tǒng)文件大小的限制;
    5.主鍵索引采用聚集索引(索引的數(shù)據(jù)域存儲數(shù)據(jù)文件本身)掷豺,輔索引的數(shù)據(jù)域存儲主鍵的值捞烟;因此從輔索引查找數(shù)據(jù),需要先通過輔索引找到主鍵值当船,再訪問輔索引题画;最好使用自增主鍵,防止插入數(shù)據(jù)時德频,為維持B+樹結構苍息,文件的大調(diào)整。

集合類

Collection(list,set)和map

arraylist如何快速排序

一種是使用 Comparable 另一種是使用 Comparator壹置,Comparable 對象可以說“我可以自己與另外一個對象比較”而一個 Comparator 對象可以說“我可以比較兩個不同的對象”

NIO與BIO的區(qū)別竞思,為何NIO能提高效率,NIO三大核心钞护,AIO

IO.PNG

NIO面向buffer避免了資源浪費

BIO:同步阻塞式IO盖喷,客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,如果BIO要能夠同時處理多個客戶端請求难咕,就必須使用多線程课梳。適用于連接數(shù)目比較小,比如下載
NIO:同步非阻塞IO步藕,關鍵是采用了事件驅(qū)動的思想來實現(xiàn)了一個多路轉(zhuǎn)換器,即客戶端發(fā)送的連接請求都會注冊到多路復用器上,這樣只需要開啟一個線程就可以處理來自多個客戶端的IO事件惦界。NIO適合處理連接數(shù)目特別多,但是連接比較短(輕操作)的場景咙冗,Jetty沾歪,Mina,ZooKeeper等都是基于java nio實現(xiàn)雾消。采用Reactor模式
AIO:異步非阻塞IO灾搏,另外開線程來通信,通信完成會調(diào)用類似的回調(diào)函數(shù)來通知立润,采用Proactor模式狂窑。AIO方式使用于連接數(shù)目多且連接比較長(重操作)的架構,比如相冊服務器桑腮。

Reactor被動的等待指示事件的到來并做出反應泉哈;它有一個等待的過程,做什么都要先放入到監(jiān)聽事件集合中等待handler可用時再進行操作;
Proactor直接調(diào)用異步讀寫操作丛晦,調(diào)用完后立刻返回奕纫。

為什么NIO能提高效率

1.io是面向流的,也就是讀取數(shù)據(jù)的時候是從流上逐個讀取烫沙,所以數(shù)據(jù)不能進行整體以為匹层,沒有緩沖區(qū);nio是面向緩沖區(qū)的,數(shù)據(jù)是存儲在緩沖區(qū)中锌蓄,讀取數(shù)據(jù)是在緩沖區(qū)中進行升筏,所以進行數(shù)據(jù)的偏移操作更加方便
2,io是阻塞的瘸爽,當一個線程操作io時如果當前沒有數(shù)據(jù)可讀您访,那么線程阻塞,nio由于是對通道操作io蝶糯,所以是非阻塞洋只,當一個通道無數(shù)據(jù)可讀,可切換通道處理其他io
3昼捍,nio有selecter選擇器识虚,就是線程通過選擇器可以選擇多個通道,而io只能處理一個

NIO三大核心

1.buffer:NIO直接讀到buffer中操作
2.channel:可以以非阻塞狀態(tài)運行
3.selector:分發(fā)請求到不同的channel
NIO是同步非阻塞妒茬,AIO是異步非阻塞担锤,AIO在讀寫完成之后才被通知,能夠勝任讀寫過程長的應用乍钻。

Dubbo

image.png

上圖中肛循,藍色的表示與業(yè)務有交互,綠色的表示只對Dubbo內(nèi)部交互银择。上述圖所描述的調(diào)用流程如下:

服務提供方發(fā)布服務到服務注冊中心多糠;
服務消費方從服務注冊中心訂閱服務;
服務消費方調(diào)用已經(jīng)注冊的可用服務
Dubbo能做什么浩考?
1.透明化的遠程方法調(diào)用夹孔,就像調(diào)用本地方法一樣調(diào)用遠程方法,只需簡單配置析孽,沒有任何API侵入搭伤。
2.軟負載均衡及容錯機制,可在內(nèi)網(wǎng)替代F5等硬件負載均衡器袜瞬,降低成本怜俐,減少單點。

  1. 服務自動注冊與發(fā)現(xiàn)邓尤,不再需要寫死服務提供方地址拍鲤,注冊中心基于接口名查詢服務提供者的IP地址贴谎,并且能夠平滑添加或刪除服務提供者。
    Dubbo 缺省協(xié)議采用單一長連接和 NIO 異步通訊殿漠。
    在dubbo分布式中赴精,序列化傳輸使用的hessian方式進行序列化:只傳成員屬性值和值的類型,不傳方法或靜態(tài)變量

服務上線怎么不影響舊版本绞幌?

當一個接口實現(xiàn),出現(xiàn)不兼容升級時一忱,可以用版本號過渡莲蜘,版本號不同的服務相互間不引用。
在低壓力時間段帘营,先升級一半提供者為新版本
再將所有消費者升級為新版本
然后將剩下的一半提供者升級為新版本

Dubbo的超時重試:

Dubbo的超時重試機制為服務容錯票渠、服務穩(wěn)定提供了比較好的框架支持 dubbo在調(diào)用服務不成功時,默認會重試2次芬迄。Dubbo的路由機制问顷,會把超時的請求路由到其他機器上,而不是本機嘗試禀梳,所以 dubbo的重試機器也能一定程度的保證服務的質(zhì)量杜窄。,但是在一些比較特殊的網(wǎng)絡環(huán)境下(網(wǎng)絡傳輸慢,并發(fā)多)可能由于服務響應慢,Dubbo自身的超時重試機制(服務端的處理時間超過了設定的超時時間時,就會有重復請求)可能會帶來一些麻煩算途。
常見的應用場景故障: 1塞耕、發(fā)送郵件(重復) ;2嘴瓤、賬戶注冊(重復).扫外。
解決方案: 對于核心的服務中心,去除dubbo超時重試機制廓脆,并重新評估設置超時時間筛谚。
(1)、去掉超時重試機制

          <dubbo:provider delay="-1" timeout="6000"  retries="0"/> 
         (2)停忿、重新評估設置超時時間
            <dubbo:service interface="*.*" ref="*"  timeout="延長服務時間"/>

dubbo的核心配置:配置應用信息驾讲,注冊中心相關信息,服務協(xié)議瞎嬉,暴露服務蝎毡,引用服務

<?xml version="1.0" encoding="UTF-8"?>
<!-- 添加 DUBBO SCHEMA -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 應用名 -->
    <dubbo:application name="dubbodemo-provider"/>
    <!-- 連接到哪個本地注冊中心 -->
    <dubbo:registry id="dubbodemo" address="zookeeper://localhost:2181"/>
    <!-- 用dubbo協(xié)議在20880端口暴露服務 -->
    <dubbo:protocol name="dubbo" port="28080"/>
    <!-- 聲明需要暴露的服務接口 -->
    <dubbo:service registry="dubbodemo" timeout="3000" interface="com.chanshuyi.service.IUserService" ref="userService"/>
</beans>

分布式

分布式的目的:
1.高可用:主機掛掉后,自動故障轉(zhuǎn)移氧枣,使前端服務對用戶無影響
2.讀寫分離:將主機讀壓力分流到從機上沐兵,可實現(xiàn)負載均衡,提高效率
分布式系統(tǒng)通信可采用面向消息的中間件ActiveMQ便监,RabbitMQ等
分布式計算可采用mapreduce
分布式存儲是可用Hbase,redis,mongoDB
分布式監(jiān)控可用zookeeper:zookeeper是開源的分布式應用程序協(xié)調(diào)服務,核心是原子廣播扎谎,這個機制保證了各個Server之間的同步碳想,實現(xiàn)這個機制的協(xié)議叫Zap協(xié)議,有兩種模式:恢復模式(選主)和廣播模式(同步)毁靶,服務啟動或主機宕機時胧奔,采用恢復模式,選出主機预吆,且大多數(shù)Server完成了和leader的狀態(tài)同步以后龙填,恢復模式就結束了。狀態(tài)同步保證了leader和Server具有相同的系統(tǒng)狀態(tài)拐叉。
zookeeper是如何保證事務的順序一致性的岩遗?

zookeeper采用了遞增的事務Id來標識,所有的proposal(提議)都在被提出的時候加上了zxid凤瘦,zxid實際上是一個64位的數(shù)字宿礁,高32位是epoch(時期; 紀元; 世; 新時代)用來標識leader是否發(fā)生改變,如果有新的leader產(chǎn)生出來蔬芥,epoch會自增梆靖,低32位用來遞增計數(shù)。當新產(chǎn)生proposal的時候笔诵,會依據(jù)數(shù)據(jù)庫的兩階段過程返吻,首先會向其他的server發(fā)出事務執(zhí)行請求,如果超過半數(shù)的機器都能執(zhí)行并且能夠成功嗤放,那么就會開始執(zhí)行思喊。

CAP原則又稱CAP定理,指的是在一個分布式系統(tǒng)中次酌,Consistency(一致性)恨课、 Availability(可用性)、Partition tolerance(分區(qū)容錯性)岳服,三者不可得兼
● 一致性(C):在分布式系統(tǒng)中的所有數(shù)據(jù)備份剂公,在同一時刻是否同樣的值。(等同于所有節(jié)點訪問同一份最新的數(shù)據(jù)副本)
● 可用性(A):在集群中一部分節(jié)點故障后吊宋,集群整體是否還能響應客戶端的讀寫請求纲辽。(對數(shù)據(jù)更新具備高可用性)
● 分區(qū)容錯性(P):以實際效果而言,分區(qū)相當于對通信的時限要求璃搜。系統(tǒng)如果不能在時限內(nèi)達成數(shù)據(jù)一致性拖吼,就意味著發(fā)生了分區(qū)的情況,必須就當前操作在C和A之間做出選擇这吻。

主從復制用單向鏈表更穩(wěn)定吊档,master和slave在同一局域網(wǎng)內(nèi)時連接更穩(wěn)定

項目

注冊登錄:
驗證焦點,得到焦點時隱藏錯誤信息唾糯,失去焦點時顯示錯誤信息怠硼。
Ajax異步請求鬼贱,Servlet調(diào)用service調(diào)用dao查詢數(shù)據(jù)庫是否存在
激活
userServlet#activation()
1.獲取激活碼2.把激活碼交給service的activation(string)來完成激活3.保存成功信息,轉(zhuǎn)發(fā)到msg.jsp顯示
userService#activation(String)
1.使用激活碼查詢user2.是null拋出異常香璃,不是null查看user的status是否為true3.不是true修改user的status為true
調(diào)用dao通過激活碼查詢用戶这难,修改用戶狀態(tài)

redis緩存:
最近瀏覽
1.用戶id做key,商品Id做value葡秒,以list存入緩存
2.為保證唯一性用lrem將list中已瀏覽的商品Id去掉姻乓,再加入
3.在lpush到list后,將前60個數(shù)據(jù)之外用LTrim修剪掉
4.用expire(key,60 * 60 * 24 * 30)添加緩存失效時間30天
購物車
購物車用hashmap,一個外鍵一個內(nèi)部鍵眯牧,外部鍵對應購物車糖权,內(nèi)部鍵對應商品,查購物車數(shù)據(jù)可以從redis中查詢炸站。
訂單信息
1.用sortedset,分數(shù)為下單時間+訂單后三位進行排序
2.數(shù)據(jù)更新成功緩存更新失敗時的數(shù)據(jù)不一致通過發(fā)mq的策略進行緩存更新嘗試

在service中調(diào)用事務提交訂單,用戶下單疚顷,庫存相應減少旱易,如果減少庫存失敗,該訂單也撤銷
易寶特點:1.支付用Https 2.用GBK編碼 3.大小寫敏感

static關鍵字

1.修飾成員變量和方法腿堤,讓他們成為類的成員屬性和方法阀坏,一個對象如果對static修飾的屬性做了改變,其他的對象都會受到影響笆檀;修飾方法時忌堂,可以使用"類名.方法名"的方式操作方法,避免了先要new出對象的繁瑣和資源消耗酗洒。
2.靜態(tài)代碼塊士修,當我們初始化static修飾的成員時,可以將他們統(tǒng)一放在一個以static修飾的代碼塊中樱衷。

CountDownLatch棋嘲,ThreadLocal,CyclicBarrier

CountDownLatch這個類能夠使一個線程等待其他線程完成各自的工作后再執(zhí)行矩桂,通過計數(shù)器實現(xiàn)沸移,每當線程完成任務后,計數(shù)器減1侄榴,到達0時雹锣,表示所有線程完成任務,在閉鎖上等待的線程就可以恢復執(zhí)行任務癞蚕。
ThreadLocal:提供線程內(nèi)部的局部變量蕊爵,在本線程隨時隨地可取,隔離其他線程
CyclicBarrier:柵欄允許兩個或多個線程在某個集合點同步

HTTP中GET與POST的區(qū)別

最直觀的區(qū)別就是GET把參數(shù)包含在URL中涣达,POST通過request body傳遞參數(shù)在辆。
由于GET把參數(shù)包含在URL证薇。而(大多數(shù))服務器最多處理64K大小的url,所以該請求有長度限制匆篓。

GET和POST還有一個重大區(qū)別浑度,
簡單的說:
GET產(chǎn)生一個TCP數(shù)據(jù)包;POST產(chǎn)生兩個TCP數(shù)據(jù)包。

長的說:
對于GET方式的請求鸦概,瀏覽器會把http header和data一并發(fā)送出去箩张,服務器響應200(返回數(shù)據(jù));
而對于POST,瀏覽器先發(fā)送header窗市,服務器響應100 continue先慷,瀏覽器再發(fā)送data,服務器響應200 ok(返回數(shù)據(jù))咨察。

狀態(tài)碼

image.png

Mysql集群原理和優(yōu)缺點

MySQL 群集分為三種節(jié)點:管理節(jié)點论熙,數(shù)據(jù)節(jié)點和SQL節(jié)點。

管理節(jié)點:主要用于管理各個節(jié)點摄狱,能夠通過命令對某個節(jié)點進行重啟秋度、關閉参淹、啟動等操作瘪松。也能夠監(jiān)視全部節(jié)點的工作狀態(tài)围小。

數(shù)據(jù)節(jié)點:主要是對數(shù)據(jù)的存儲,不提供其他的服務酣衷。

SQL節(jié)點:主要是對外提供SQL功能交惯,類似一臺普通的 MySQL Server。

而SQL節(jié)點和數(shù)據(jù)節(jié)點可以是同一臺機器穿仪,也就是說這臺機器即是SQL節(jié)點也是數(shù)據(jù)節(jié)點席爽。它們只是邏輯關系上的劃分,實際部署時牡借,甚至所有的階段都可以位于同一臺物理機器上拳昌,只是配置較復雜些。

優(yōu)缺點

優(yōu)點:

  1. 99.999 %的高可用性

  2. 快速的自動失效切換

  3. 靈活的分布式體系結構钠龙,沒有單點故障

  4. 高吞吐量和低延遲

  5. 可擴展性強炬藤,支持在線擴容

缺點:

  1. 存在很多限制,比如:不支持外鍵碴里,數(shù)據(jù)行不能超過8K(不包括BLOB和text中的數(shù)據(jù))

  2. 部署沈矿、管理、配置很復雜

  3. 占用磁盤空間大咬腋,內(nèi)存大

  4. 備份和恢復不方便

  5. 重啟的時候羹膳,數(shù)據(jù)節(jié)點將數(shù)據(jù)load到內(nèi)存需要很長時間

分布式session一致性

保證session一致性的架構設計常見方法:

  • session同步法:多臺web-server相互同步數(shù)據(jù)。缺點:占內(nèi)網(wǎng)帶寬

  • 客戶端cookie存儲法:一個用戶只存儲自己的數(shù)據(jù)根竿。缺點:有大小限制陵像,占外網(wǎng)帶寬就珠,不安全

  • 后端統(tǒng)一存儲:web-server重啟和擴容,session也不會丟失(建議的方式)

線程池

http://www.reibang.com/p/179113d1454b

接口如何處理重復請求醒颖?

最好用的:基于redis緩存的計數(shù)器由于數(shù)據(jù)庫的操作比較消耗性能妻怎,了解到redis的計數(shù)器也是原子性操作 ,而且能提升qps的峰值泞歉。 每次request進來則新建一個以orderId為key的計數(shù)器逼侦,然后+1。 如果>1(不能獲得鎖): 說明有操作在進行腰耙,刪除榛丢。 如果=1(獲得鎖): 可以操作。 操作結束(刪除鎖):刪除這個計數(shù)器挺庞。

緩存穿透與緩存雪崩

什么是緩存穿透晰赞?

一般的緩存系統(tǒng),都是按照key去緩存查詢选侨,如果不存在對應的value宾肺,就應該去后端系統(tǒng)查找(比如DB)。如果key對應的value是一定不存在的侵俗,并且對該key并發(fā)請求量很大,就會對后端系統(tǒng)造成很大的壓力丰刊。這就叫做緩存穿透隘谣。

如何避免?

1.對查詢結果為空的情況也進行緩存啄巧,緩存時間設置短一點寻歧,或者該key對應的數(shù)據(jù)insert了之后清理緩存。2.采用布隆過濾器秩仆,將所有可能存在的數(shù)據(jù)哈希到一個足夠大的bitmap中码泛,一個一定不存在的數(shù)據(jù)會被這個bitmap攔截掉,從而避免了對底層存儲系統(tǒng)的查詢壓力澄耍。

什么是緩存雪崩噪珊?

當緩存服務器重啟或者大量緩存集中在某一個時間段失效,這樣在失效的時候齐莲,也會給后端系統(tǒng)(比如DB)帶來很大壓力痢站。

如何避免?

1:在緩存失效后选酗,通過加鎖或者隊列來控制讀數(shù)據(jù)庫寫緩存的線程數(shù)量阵难。比如對某個key只允許一個線程查詢數(shù)據(jù)和寫緩存,其他線程等待芒填。

2:不同的key呜叫,設置不同的過期時間空繁,讓緩存失效的時間點盡量均勻。

3:做二級緩存朱庆,A1為原始緩存盛泡,A2為拷貝緩存,A1失效時椎工,可以訪問A2饭于,A1緩存失效時間設置為短期,A2設置為長期(此點為補充)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末维蒙,一起剝皮案震驚了整個濱河市掰吕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颅痊,老刑警劉巖殖熟,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斑响,居然都是意外死亡菱属,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門舰罚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纽门,“玉大人,你說我怎么就攤上這事营罢∩土辏” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵饲漾,是天一觀的道長蝙搔。 經(jīng)常有香客問我,道長考传,這世上最難降的妖魔是什么吃型? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮僚楞,結果婚禮上勤晚,老公的妹妹穿的比我還像新娘。我一直安慰自己泉褐,他們只是感情好运翼,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兴枯,像睡著了一般血淌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天悠夯,我揣著相機與錄音癌淮,去河邊找鬼。 笑死沦补,一個胖子當著我的面吹牛乳蓄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夕膀,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼虚倒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了产舞?” 一聲冷哼從身側響起魂奥,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎易猫,沒想到半個月后耻煤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡准颓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年哈蝇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攘已。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡炮赦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出样勃,到底是詐尸還是另有隱情眼五,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布彤灶,位于F島的核電站,受9級特大地震影響批旺,放射性物質(zhì)發(fā)生泄漏幌陕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一汽煮、第九天 我趴在偏房一處隱蔽的房頂上張望搏熄。 院中可真熱鬧,春花似錦暇赤、人聲如沸心例。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽止后。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間译株,已是汗流浹背瓜喇。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留歉糜,地道東北人乘寒。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像匪补,于是被迫代替她去往敵國和親伞辛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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