동기화여부에 대한 차이!

StringBuilder

  • 동기화 x
  • 단일 쓰레드 환경에서 효율이 좋다
  • 멀티 쓰레드 환경에서 다수의 쓰레드들이 StringBuilder 클래스에 접근이 가능 (= 취약함)

StringBuffer

  • Synchronized (동기화를 보장한다.)
  • 멀티쓰레드 환경에서 동기화 지원
  • 멀티 쓰레드 환경에서 다수의 쓰레드들이 StringBuffer 클래스에 접근이 불가능 (= 안정적)
StringBuffer stringBuffer = new StringBuffer();
StringBuilder stringBuilder = new StringBuilder();

new Thread(() -> {
    for(int i=0; i<10000; i++) {
        stringBuffer.append(i);
        stringBuilder.append(i);
    }
}).start();

new Thread(() -> {
    for(int i=0; i<10000; i++) {
        stringBuffer.append(i);
        stringBuilder.append(i);
    }
}).start();

new Thread(() -> {
    try {
        Thread.sleep(5000);

        System.out.println("StringBuffer.length: "+ stringBuffer.length());
        System.out.println("StringBuilder.length: "+ stringBuilder.length());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}).start();

결과: 
    StringBuffer.length: 77780
    StringBuilder.length: 76412


쓰레드에 관련있는 경우 Buffer 권장

쓰레드에 관련없는 경우 Builder 권장



References

  • https://novemberde.github.io/2017/04/15/String_0.html
  • https://12bme.tistory.com/42