1. 程式人生 > >程式碼驗證java的StringBuffer是執行緒安全而StringBuilder是執行緒不安全的

程式碼驗證java的StringBuffer是執行緒安全而StringBuilder是執行緒不安全的

package practice;  
  
//通過反轉字串來驗證StringBuffer是執行緒安全而StringBuilder是執行緒不安全的  
public class Practice {  
    public static void main(String[] args) {  
        /* 
         * 宣告個字串s,用下劃線和井號是因為兩個比較好區分。 分別例項化sf和sd兩個物件 
         */  
        String s = "####____";  
        StringBuffer sf = new StringBuffer(s);  
        StringBuilder sd = new StringBuilder(s);  
        /* 
         * 對sf和sd各自例項化兩個反轉他們的類 
         */  
        ThreadReverseString sfr1 = new ThreadReverseString(sf);  
        ThreadReverseString sfr2 = new ThreadReverseString(sf);  
        ThreadReverseString sdr1 = new ThreadReverseString(sd);  
        ThreadReverseString sdr2 = new ThreadReverseString(sd);  
        /* 
         * 啟動這四個執行緒,此時sf和sd各自有兩個執行緒在對他們進行字串反轉操作 
         */  
        new Thread(sfr1).start();  
        new Thread(sfr2).start();  
        new Thread(sdr1).start();  
        new Thread(sdr2).start();  
    }  
}  
  
class ThreadReverseString implements Runnable {  
    /* 
     * 這個類用來完成字串的反轉工作,使用了Runnable介面來實現多執行緒 times是用來表示迴圈多少次的 
     * 因為懶的再寫一個變數所以用了一個Object型別的s,後面再轉化 
     */  
    public Object s = null;  
    int times = 200;  
  
    /* 
     * 兩個構造方法把s傳進來 
     */  
    public ThreadReverseString(StringBuffer s) {  
        this.s = s;  
    }  
  
    public ThreadReverseString(StringBuilder s) {  
        this.s = s;  
    }  
  
    /* 
     * 複寫run方法實現多執行緒 在我的電腦上大概迴圈200次可以看到效果了,也許換了電腦就得多試幾次或者增加迴圈次數了 
     */  
    public void run() {  
        for (int i = 0; i <= times; i++) {  
            /* 
             * 似乎sleep一小段效果會好一些 奇奇怪怪的輸出格式只是為了便於比較 
             */  
            try {  
                Thread.sleep(1);  
            } catch (InterruptedException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
  
            if (s instanceof StringBuffer) {  
                ((StringBuffer) s).reverse();  
                System.out.println("BUFFER->" + s);  
            } else if (s instanceof StringBuilder) {  
                ((StringBuilder) s).reverse();  
                System.out.println("        " + s + "<-builder");  
            }  
        }  
    }  
}  
/* 
 * 最後看一下控制檯的輸出會發現反轉後出現井號和下劃線交錯的都是StringBuilder的輸出 
 */