2019-03-04

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了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容