StringBuffer是否真的線程安全的驗證
為了驗證StringBuffer是不是真的線程安全,我寫了一個測試程序來驗證,示例代碼如下:
public class StringBudr {
public static void main(String args[]) {
StringBuffer buffer = new StringBuffer("");
StringBuilder builder = new StringBuilder("");
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
buffer.append("a");
builder.append("b");
}
}).start();
}
System.out.println("buffer:" + buffer.length());
System.out.println("builder:" + builder.length());
}
}
某次執(zhí)行結(jié)果如下:
buffer:997
builder:1000
這個執(zhí)行結(jié)果和預(yù)期的可不一樣啊,想了想,把線程數(shù)目調(diào)成20,并且把2個字符串的內(nèi)容也打印出來
public class StringBudr {
public static void main(String args[]) {
StringBuffer buffer = new StringBuffer("");
StringBuilder builder = new StringBuilder("");
for (int i = 0; i < 20; i++) {
new Thread(new Runnable() {
@Override
public void run() {
buffer.append("a");
builder.append("b");
}
}).start();
}
System.out.println("buffer:" + buffer.length());
System.out.println(buffer.toString());
System.out.println("builder:" + builder.length());
System.out.println(builder.toString());
}
}
再次執(zhí)行
buffer:19
aaaaaaaaaaaaaaaaaaaa
builder:20
bbbbbbbbbbbbbbbbbbbb
打印的結(jié)果沒有問題,但是程序顯示的字符長度卻不正確。想了想,可能是前面的線程沒有執(zhí)行完,修改下代碼
public class StringBudr {
public static void main(String args[]) {
StringBuffer buffer = new StringBuffer("");
StringBuilder builder = new StringBuilder("");
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
buffer.append("a");
builder.append("b");
}
}).start();
}
while (Thread.activeCount() > 1)
Thread.yield();
System.out.println("buffer:" + buffer.length());
System.out.println("builder:" + builder.length());
改成這樣之后,buffer和builder的長度打印出來都是1000了