java中stringbuffer線程安全分析實(shí)例詳解
在對(duì)于一些類作用于線程時(shí),安全系數(shù)高的線程更推薦大家使用,在盡可能的程度上降低程序出錯(cuò)的可能性。對(duì)于本篇所要提到的StringBuffer而言,在其緩沖區(qū)中有多個(gè)線程的存在,我們?cè)诓樵兤鋬?nèi)部方法時(shí)發(fā)現(xiàn)了鎖的存在?,F(xiàn)在我們就StringBuffer線程、鎖的應(yīng)用、線程安全分析逐步帶來(lái)介紹。
1.StringBuffer線程說(shuō)明
Java.lang.StringBuffer線程安全的可變字符序列。一個(gè)類似于String的字符串緩沖區(qū),但不能修改。雖然在任意時(shí)間點(diǎn)上它都包含某種特定的字符序列,但通過(guò)某些方法調(diào)用可以改變?cè)撔蛄械拈L(zhǎng)度和內(nèi)容。
可將字符串緩沖區(qū)安全地用于多個(gè)線程??梢栽诒匾獣r(shí)對(duì)這些方法進(jìn)行同步,因此任意特定實(shí)例上的所有操作就好像是以串行順序發(fā)生的,該順序與所涉及的每個(gè)線程進(jìn)行的方法調(diào)用順序一致。
2.synchronized鎖的應(yīng)用方式
(1)修飾實(shí)例方法,對(duì)當(dāng)前實(shí)例加鎖
public synchronized StringBuffer append(int i) {
toStringCache = null;
super.append(i);
return this;
}
(2)修飾靜態(tài)方法,對(duì)當(dāng)前類對(duì)象加鎖
public static synchronized void test(){
i++;
}
(3)修飾代碼塊,對(duì)指定對(duì)象加鎖
public boolean contentEquals(CharSequence cs) {
// Argument is a StringBuffer, StringBuilder
synchronized(cs) {
return nonSyncContentEquals((AbstractStringBuilder)cs);
}
}
3.線程安全分析
StringBuffer buffer= new StringBuffer();
buffer.append("d");
然后進(jìn)入appen里面看看
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
看到synchronized,在方法上面,說(shuō)明是有線程安全的。
關(guān)于stringbuffer基礎(chǔ)知識(shí)點(diǎn)擴(kuò)展:
StringBuffer
當(dāng)對(duì)字符串進(jìn)行修改的時(shí)候,需要使用 StringBuffer 和 StringBuilder 類。
和 String 類不同的是,StringBuffer 和 StringBuilder 類的對(duì)象能夠被多次的修改,并且不產(chǎn)生新的未使用對(duì)象。
StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不同在于 StringBuilder 的方法不是線程安全的(不能同步訪問(wèn))。
由于 StringBuilder 相較于 StringBuffer 有速度優(yōu)勢(shì),所以多數(shù)情況下建議使用 StringBuilder 類。然而在應(yīng)用程序要求線
程安全的情況下,則必須使用 StringBuffer 類
字符串 的內(nèi)容一旦創(chuàng)建,則不允許改變,如果一旦改變,則會(huì)創(chuàng)建一個(gè)新的字符串對(duì)象。
字符串的內(nèi)容一般不會(huì)隨意的修改,因?yàn)槊啃薷囊淮味紩?huì)創(chuàng)建一個(gè)新的字符串對(duì)象。
如果需要修改字符串的內(nèi)容:建議使用字符串緩沖區(qū)類。
StringBuffer(字符串緩沖區(qū)類): 存儲(chǔ)字符的集合容器。
筆試題: 使用Stringbuffer無(wú)參的構(gòu)造方法默認(rèn)的初始化容量是多少? 當(dāng)容量不夠用時(shí)會(huì)自動(dòng)增長(zhǎng)多少?
StringBuffer的底層是維護(hù)了一個(gè)字符數(shù)組,存儲(chǔ)字符的時(shí)候?qū)嶋H上是往該字符數(shù)組中存儲(chǔ) 的,
而字符數(shù)組的初始化容量是16, 當(dāng)容量不夠使用時(shí),自動(dòng)增長(zhǎng)1倍。
到此這篇關(guān)于java中stringbuffer線程安全分析實(shí)例詳解的文章就介紹到這了,更多相關(guān)java中stringbuffer線程安全分析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java中String StringBuffer和StringBuilder的區(qū)別詳解
- java中String、StringBuffer與StringBuilder的區(qū)別
- JAVA基礎(chǔ)類庫(kù)之String類,StringBuffer類和StringBuilder類
- java中StringBuffer的length()和capacity()方法對(duì)比
- Java基礎(chǔ)之StringBuffer詳解
- Java利用StringBuffer替換特殊字符的方法實(shí)現(xiàn)
- Java常用類庫(kù)StringBuffer,Runtime,日期操作類等類庫(kù)總結(jié)
- java String、StringBuilder和StringBuffer的區(qū)別詳解
- Java 基礎(chǔ)全面講解StringBuffer類的使用
相關(guān)文章
JavaWeb實(shí)戰(zhàn)之編寫單元測(cè)試類測(cè)試數(shù)據(jù)庫(kù)操作
這篇文章主要介紹了JavaWeb實(shí)戰(zhàn)之編寫單元測(cè)試類測(cè)試數(shù)據(jù)庫(kù)操作,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)javaweb的小伙伴們有很大的幫助,需要的朋友可以參考下2021-04-04
淺談hashmap為什么查詢時(shí)間復(fù)雜度為O(1)
這篇文章主要介紹了hashmap為什么查詢時(shí)間復(fù)雜度為O(1),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Springcloud基于OpenFeign實(shí)現(xiàn)服務(wù)調(diào)用代碼實(shí)例
這篇文章主要介紹了Springcloud基于OpenFeign實(shí)現(xiàn)服務(wù)調(diào)用代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Java虛擬機(jī)內(nèi)存結(jié)構(gòu)及編碼實(shí)戰(zhàn)分享
這篇文章主要介紹了Java虛擬機(jī)內(nèi)存結(jié)構(gòu)及編碼實(shí)戰(zhàn)分享,文章圍繞詳細(xì)主題展開(kāi)相關(guān)資料具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04
淺談SpringBoot集成Quartz動(dòng)態(tài)定時(shí)任務(wù)
這篇文章主要介紹了SpringBoot集成Quartz動(dòng)態(tài)定時(shí)任務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
解決idea更新maven倉(cāng)庫(kù)的圖文教程
這篇文章主要介紹了解決idea更新maven倉(cāng)庫(kù)的圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
SpringCloud?Eureka服務(wù)治理之服務(wù)注冊(cè)服務(wù)發(fā)現(xiàn)
這篇文章主要介紹了SpringCloud?Eureka服務(wù)治理服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)概念詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08

