java中stringbuffer線程安全分析實例詳解
在對于一些類作用于線程時,安全系數(shù)高的線程更推薦大家使用,在盡可能的程度上降低程序出錯的可能性。對于本篇所要提到的StringBuffer而言,在其緩沖區(qū)中有多個線程的存在,我們在查詢其內(nèi)部方法時發(fā)現(xiàn)了鎖的存在。現(xiàn)在我們就StringBuffer線程、鎖的應(yīng)用、線程安全分析逐步帶來介紹。
1.StringBuffer線程說明Java.lang.StringBuffer線程安全的可變字符序列。一個類似于String的字符串緩沖區(qū),但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調(diào)用可以改變該序列的長度和內(nèi)容。
可將字符串緩沖區(qū)安全地用于多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發(fā)生的,該順序與所涉及的每個線程進行的方法調(diào)用順序一致。
2.synchronized鎖的應(yīng)用方式(1)修飾實例方法,對當前實例加鎖
public synchronized StringBuffer append(int i) { toStringCache = null; super.append(i); return this; }
(2)修飾靜態(tài)方法,對當前類對象加鎖
public static synchronized void test(){ i++; }
(3)修飾代碼塊,對指定對象加鎖
public boolean contentEquals(CharSequence cs) { // Argument is a StringBuffer, StringBuilder synchronized(cs) { return nonSyncContentEquals((AbstractStringBuilder)cs); } }3.線程安全分析
StringBuffer buffer= new StringBuffer(); buffer.append('d');然后進入appen里面看看@Override public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; }
看到synchronized,在方法上面,說明是有線程安全的。
關(guān)于stringbuffer基礎(chǔ)知識點擴展:
StringBuffer
當對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。
和 String 類不同的是,StringBuffer 和 StringBuilder 類的對象能夠被多次的修改,并且不產(chǎn)生新的未使用對象。
StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不同在于 StringBuilder 的方法不是線程安全的(不能同步訪問)。
由于 StringBuilder 相較于 StringBuffer 有速度優(yōu)勢,所以多數(shù)情況下建議使用 StringBuilder 類。然而在應(yīng)用程序要求線
程安全的情況下,則必須使用 StringBuffer 類
字符串 的內(nèi)容一旦創(chuàng)建,則不允許改變,如果一旦改變,則會創(chuàng)建一個新的字符串對象。
字符串的內(nèi)容一般不會隨意的修改,因為每修改一次都會創(chuàng)建一個新的字符串對象。
如果需要修改字符串的內(nèi)容:建議使用字符串緩沖區(qū)類。
StringBuffer(字符串緩沖區(qū)類): 存儲字符的集合容器。
筆試題: 使用Stringbuffer無參的構(gòu)造方法默認的初始化容量是多少? 當容量不夠用時會自動增長多少?
StringBuffer的底層是維護了一個字符數(shù)組,存儲字符的時候?qū)嶋H上是往該字符數(shù)組中存儲 的,
而字符數(shù)組的初始化容量是16, 當容量不夠使用時,自動增長1倍。
到此這篇關(guān)于java中stringbuffer線程安全分析實例詳解的文章就介紹到這了,更多相關(guān)java中stringbuffer線程安全分析內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. python3實現(xiàn)往mysql中插入datetime類型的數(shù)據(jù)2. moment轉(zhuǎn)化時間戳出現(xiàn)Invalid Date的問題及解決3. python爬蟲實戰(zhàn)之制作屬于自己的一個IP代理模塊4. PHP如何打印跟蹤調(diào)試信息5. python如何實現(xiàn)word批量轉(zhuǎn)HTML6. Java8內(nèi)存模型PermGen Metaspace實例解析7. ASP中if語句、select 、while循環(huán)的使用方法8. msxml3.dll 錯誤 800c0019 系統(tǒng)錯誤:-2146697191解決方法9. 匹配模式 - XSL教程 - 410. 小技巧處理div內(nèi)容溢出
