StringBuffer VS StringBuilder

StringBuffer

生成されるオブジェクトは1つだけになる。

StringBuilder

スレッドセーフではない。(同期化しない) インスタンスにアクセスするようなコードは動作や実行結果が保証できない。

検証

StringBufferTester.java

public class StringBufferTester implements Runnable {
    // スレッドセーフなクラス
    private StringBuffer sb = new StringBuffer();

    @Override
    public void run() {
        for (int i=0; i<100; i++) {
            sb.append('#');
        }
    }
    public int length() {
        return sb.length();
    }
}

StringBuilderTester.java

public class StringBuilderTester implements Runnable {
    // スレッドセーフでないクラス
    private StringBuilder sb = new StringBuilder();

    @Override
    public void run() {
        for (int i=0; i<100; i++) {
            sb.append('#');
        }
    }
    public int length() {
        return sb.length();
    }
}

ThreadExecuter.java

public class ThreadExecuter {
    private static final int THREAD_MAX = 100;
    
    public static void main(String[] args) throws InterruptedException {
        StringBufferTester tester = new StringBufferTester();
        Thread[] ts = new Thread[THREAD_MAX];
        // スレッド初期化
        for (int i=0; i<THREAD_MAX; i++) {
            ts[i] = new Thread(tester);
        }
        // スレッド開始
        for (Thread t : ts) {
            t.start();
        }
        // スレッド同期
        for (Thread t : ts) {
            t.join();
        }
        System.out.println("Result:" + tester.length());
    }
}

※参考サイト qiita.com totech.hateblo.jp