String厢呵、StringBuffer、StringBuilder
String 不可變字符序列秸妥,JDK1.0
StringBuffer 線程安全的可變字符序列,JDK1.0
StringBuilder 非線程安全的可變字符序列,JDK1.5
String是一個(gè)類手销,不是基本數(shù)據(jù)類型,String是值傳入碧信,非引用傳入。
StringBuffer和StringBuilder兩個(gè)很像街夭,在線程安全方面砰碴,StringBuffer允許多線程進(jìn)行字符操作,這是因?yàn)樵赟tringBuffer的很多方法都被關(guān)鍵字synnchronized
修飾板丽,而StringBuilder沒有
StringBuilder的效率比StringBuffer稍高呈枉,如果不考慮線程安全,StringBuilder應(yīng)該是首選埃碱。另外猖辫,JVM運(yùn)行程序主要時(shí)間耗費(fèi)是在創(chuàng)建對(duì)象和回收對(duì)象上。
單線程運(yùn)行效率: String << StringBuffer < StringBuilder
非線程安全:StringBuilder
線程安全:StringBuffer
單線程最佳:StringBuilder
sleep和wait的區(qū)別
sleep
是線程類Thread的方法砚殿,執(zhí)行此方法會(huì)導(dǎo)致當(dāng)前線程暫停指定時(shí)間啃憎,給其他線程執(zhí)行機(jī)會(huì),但是監(jiān)控狀態(tài)依然保持似炎,到時(shí)候會(huì)自動(dòng)恢復(fù)辛萍。調(diào)用sleep不會(huì)釋放對(duì)象鎖。sleep可以在任何地方使用羡藐。sleep必須捕獲異常贩毕。
wait
是Object類的方法,對(duì)此對(duì)象調(diào)用wait方法導(dǎo)致本線程放棄對(duì)象鎖仆嗦,進(jìn)入等待此對(duì)象的等待鎖定池辉阶,只有針對(duì)次對(duì)象調(diào)用notify或者notifyAll方法后本線程才獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。使用wait的時(shí)候必須使用同步控制塊(synchronized)或者同步控制方法瘩扼。wait不用捕獲異常
抽象類和接口
抽象類:
- 抽象類可以有構(gòu)造方法
- 抽象類中可以存在普通屬性谆甜,方法,靜態(tài)屬性和方法
- 抽象類中可以存在抽象方法
- 如果一個(gè)類中有一個(gè)抽象方法集绰,那么當(dāng)前類一定是抽象類店印;抽象類中不一定有抽象方法
- 抽象類中的抽象方法,需要有子類實(shí)現(xiàn)倒慧,如果子類不識(shí)閑按摘,則子類也需要定義為抽象的
接口:
- 在接口中只有方法的生命包券,沒有方法體
- 在接口中只有常量,因?yàn)槎x的變量炫贤,在編譯的時(shí)候都會(huì)默認(rèn)加上
public static final
- 接口中沒有構(gòu)造方法溅固,永遠(yuǎn)都被public來修飾
- 接口中沒有改造方法,也不能實(shí)例化接口的對(duì)象
- 接口可以實(shí)現(xiàn)多繼承
- 接口定義的方法都需要有實(shí)現(xiàn)類來實(shí)現(xiàn)兰珍,如果實(shí)現(xiàn)類不能實(shí)現(xiàn)接口中的多有方法則實(shí)現(xiàn)需要定義為抽象類
Java異常
Exception異常:是程序本身可以處理的異常
Error錯(cuò)誤:是程序無法處理的錯(cuò)誤侍郭,這些錯(cuò)誤表示故障發(fā)生于虛擬機(jī)自身,或者發(fā)生在虛擬機(jī)試圖執(zhí)行應(yīng)用時(shí)掠河,一般不需要程序處理
檢查異常(編譯器要求必須處置的異常):除了Error亮元,RuntimeException及其子類以外,其他的Exception類及其子類都屬于檢查異常唠摹,這種異常的特點(diǎn)是Java編譯器會(huì)檢查它爆捞,也就是說,當(dāng)程序中可能出現(xiàn)這類異常勾拉,要么用try-catch語句進(jìn)行捕獲煮甥,要么用throws子句拋出,否則編譯不過
非檢查異常(編譯器不要求處置的異常):包括運(yùn)行時(shí)異常(RuntimeException及其子類)和錯(cuò)誤(Error)
java類的成員初始化順序和初始化塊知識(shí)
屬性藕赞、方法成肘、構(gòu)造方法和自由塊都是類中的成員,在創(chuàng)建類的對(duì)象時(shí)斧蜕,類中各成員的執(zhí)行順序:
- 父類靜態(tài)成員和靜態(tài)初始化快双霍,按在代碼中出現(xiàn)的順序依次執(zhí)行。
- 子類靜態(tài)成員和靜態(tài)初始化塊批销,按在代碼中出現(xiàn)的順序依次執(zhí)行洒闸。
- 父類的實(shí)例成員和實(shí)例初始化塊,按在代碼中出現(xiàn)的順序依次執(zhí)行风钻。
- 執(zhí)行父類的構(gòu)造方法。
- 子類實(shí)例成員和實(shí)例初始化塊酒请,按在代碼中出現(xiàn)的順序依次執(zhí)行骡技。
- 執(zhí)行子類的構(gòu)造方法。
Java鎖
Java中的鎖作為并發(fā)共享數(shù)據(jù)羞反,保證一致性的工具布朦,在java平臺(tái)有多種實(shí)現(xiàn)。
- 自旋鎖 ,自旋昼窗,jvm默認(rèn)是10次吧是趴,有jvm自己控制。for去爭取鎖
- 阻塞鎖 被阻塞的線程澄惊,不會(huì)爭奪鎖唆途。
- 可重入鎖 多次進(jìn)入改鎖的域
- 讀寫鎖
- 互斥鎖 鎖本身就是互斥的
- 悲觀鎖 不相信富雅,這里會(huì)是安全的,必須全部上鎖
- 樂觀鎖 相信肛搬,這里是安全的没佑。
- 公平鎖 有優(yōu)先級(jí)的鎖
- 非公平鎖 無優(yōu)先級(jí)的鎖
- 偏向鎖 無競爭不鎖,有競爭掛起温赔,轉(zhuǎn)為輕量鎖
- 對(duì)象鎖 鎖住對(duì)象
- 線程鎖
- 鎖粗化 多鎖變成一個(gè)蛤奢,自己處理
- 輕量級(jí)鎖 CAS 實(shí)現(xiàn)
- 鎖消除 偏向鎖就是鎖消除的一種
- 鎖膨脹 jvm實(shí)現(xiàn),鎖粗化
- 信號(hào)量 使用阻塞鎖 實(shí)現(xiàn)的一種策略
- 排它鎖:X鎖陶贼,若事務(wù)T對(duì)數(shù)據(jù)對(duì)象A加上X鎖啤贩,則只允許T讀取和修改A,其他任何事務(wù)都不能再對(duì)A加任何類型的鎖拜秧,直到T釋放A上的鎖痹屹。這就保證了其他事務(wù)在T釋放A上的鎖之前不能再讀取和修改A。
產(chǎn)生死鎖的主要原因
- 因?yàn)橄到y(tǒng)資源不足
- 進(jìn)程運(yùn)行推進(jìn)的順序不合適
- 資源分配不當(dāng)
如果系統(tǒng)資源充足腹纳,進(jìn)程的資源請(qǐng)求都能夠得到滿足痢掠,出現(xiàn)死鎖的可能性很低,否則就會(huì)因?yàn)闋帄Z優(yōu)先的資源而陷入死鎖嘲恍。進(jìn)程運(yùn)行推進(jìn)順序與速度不同足画,也可能產(chǎn)生死鎖
產(chǎn)生死鎖的4個(gè)必要條件
- 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用
- 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放
- 不剝奪條件:進(jìn)程已獲得的資源佃牛,在未使用完之前淹辞,不能強(qiáng)行剝奪
- 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾詳解的循環(huán)等待資源關(guān)系
上面是產(chǎn)生死鎖的4個(gè)條件,只要系統(tǒng)發(fā)生死鎖俘侠,這些條件必然成立象缀,只要上述條件之一不滿足,就不會(huì)產(chǎn)生死鎖
死鎖的解除與預(yù)防
理解了產(chǎn)生死鎖的原因和產(chǎn)生死鎖的四個(gè)必要條件爷速,就可以最大可能的避免央星,預(yù)防和接觸死鎖。
在系統(tǒng)設(shè)計(jì)惫东,進(jìn)程調(diào)度等方面注意如何不讓產(chǎn)生死鎖的4個(gè)必要條件成立莉给,如何確定資源的合理分配算法,避免進(jìn)程永久占據(jù)系統(tǒng)資源廉沮。此外颓遏,也要防止進(jìn)程在處于等待狀態(tài)的情況下占用資源。因此滞时,對(duì)資源的的分配要給予合理的規(guī)劃叁幢。