Java:程式碼驗證 StringBuffer 執行緒安全,StringBuilder 非執行緒安全
阿新 • • 發佈:2019-01-06
本文內容大多基於官方文件和網上前輩經驗總結,經過個人實踐加以整理積累,僅供參考。
首先需要明白什麼是執行緒安全,什麼是非執行緒安全,引用百度百科
下面用程式碼進行驗證:
1 定義一個執行緒類,迴圈執行 StringBuffer 和 StringBuilder 的 append 方法,執行一次執行緒休眠 10 毫秒
class CustomThread extends Thread {
private StringBuffer buffer;
private StringBuilder builder;
public CustomThread(StringBuffer buffer, StringBuilder builder) {
this .buffer = buffer;
this.builder = builder;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
buffer.append("A");
builder.append("Z");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("StringBuffer Size:" + buffer.length()
+ " | "
+ "StringBuilder Size:" + builder.length());
}
}
2 定義測試方法,迴圈新建 10 個執行緒類並呼叫 start 方法
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 10 ; i++) {
new CustomThread(buffer, builder).start();
}
}
3 測試結果,10個執行緒,每個執行緒迴圈1000次,如果執行緒安全則全部執行完成後字串長度應該都是 10 * 1000 = 10000,測試結果中顯示 StringBuffer 最終長度的確是 10000,StringBuilder 最大長度只有9956,說明 StringBuilder 非執行緒安全