【109期】面試官:我們說StringBuilder是線程不安全的,是什么原因呢?
閱讀本文大概需要 3.4 分鐘。
來自:juejin.im/post/5d6228046fb9a06add4e37fe
引言
分析
public?class?StringBuilderDemo?{
????public?static?void?main(String[]?args)?throws?InterruptedException?{
????????StringBuilder?stringBuilder?=?new?StringBuilder();
????????for?(int?i?=?0;?i?10;?i++){
????????????new?Thread(new?Runnable()?{
????????????????@Override
????????????????public?void?run()?{
????????????????????for?(int?j?=?0;?j?1000;?j++){
????????????????????????stringBuilder.append("a");
????????????????????}
????????????????}
????????????}).start();
????????}
????????Thread.sleep(100);
????????System.out.println(stringBuilder.length());
????}
}

1、為什么輸出值跟預(yù)期值不一樣
//存儲字符串的具體內(nèi)容
char[]?value;
//已經(jīng)使用的字符數(shù)組的數(shù)量
int?count;
@Override
public?StringBuilder?append(String?str)?{
????super.append(str);
????return?this;
}
public?AbstractStringBuilder?append(String?str)?{
????if?(str?==?null)
????????return?appendNull();
????int?len?=?str.length();
????ensureCapacityInternal(count?+?len);
????str.getChars(0,?len,?value,?count);
????count?+=?len;
????return?this;
}
2、為什么會拋出ArrayIndexOutOfBoundsException異常。
private?void?ensureCapacityInternal(int?minimumCapacity)?{
????????//?overflow-conscious?code
????if?(minimumCapacity?-?value.length?>?0)
????????expandCapacity(minimumCapacity);
}
void?expandCapacity(int?minimumCapacity)?{
????//計算新的容量
????int?newCapacity?=?value.length?*?2?+?2;
????//中間省略了一些檢查邏輯
????...
????value?=?Arrays.copyOf(value,?newCapacity);
}
public?static?char[]?copyOf(char[]?original,?int?newLength)?{
????char[]?copy?=?new?char[newLength];
????//拷貝數(shù)組
????System.arraycopy(original,?0,?copy,?0,
?????????????????????????Math.min(original.length,?newLength));
????return?copy;
}
str.getChars(0,?len,?value,?count);
public?void?getChars(int?srcBegin,?int?srcEnd,?char?dst[],?int?dstBegin)?{
????//中間省略了一些檢查
????...???
????System.arraycopy(value,?srcBegin,?dst,?dstBegin,?srcEnd?-?srcBegin);
????}




推薦閱讀:
【108期】面試官:你真的知道 Java 類是如何被加載的嗎?
【107期】談?wù)劽嬖嚤貑柕腏ava內(nèi)存區(qū)域(運行時數(shù)據(jù)區(qū)域)和內(nèi)存模型(JMM)
【106期】面試官:Java中的finally一定會被執(zhí)行嗎?
微信掃描二維碼,關(guān)注我的公眾號
朕已閱?
評論
圖片
表情

