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