이번 포스팅은 StringBuffer를 알아보고 StringBuilder와의 차이에 대해 포스팅하려고 합니다.
우선, StringBuffer는 StringBuilder와 마찬가지로 불변 객체가 아닙니다.
따라서, 문자열을 수정할 경우 String처럼 새로운 객체가 생성되지 않습니다.
두 클래스의 차이점은 thread-safe
한가 그렇지 않은가로 나눌 수 있습니다.
StringBuffer의 경우 thread-safe
합니다. 메서드에 synchronized
가 붙어 있는 것을 확인할 수 있습니다. 즉, 멀티 스레드인 상황에서 안전합니다.
반면, StringBuilder의 경우는 thread-safe
하지 않습니다. 멀티 스레드인 상황에서 안전하지 않지만, StringBuffer보다 상대적으로 빠릅니다.
class Task implements Runnable {
StringBuilder sb = new StringBuilder();
public void run() {
for (int i = 0; i < 1000; i++) {
sb.append(1);
}
}
}
Task task = new Task();
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println(task.sb.length()); // 결과 : 1419
하지만 결과는 1419개가 나옵니다. 즉, 스레드 간 간섭이 발생했다고 볼 수 있습니다.
class Task implements Runnable {
StringBuffer sb = new StringBuffer();
public void run() {
for (int i = 0; i < 1000; i++) {
sb.append(1);
}
}
}
Task task = new Task();
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println(task.sb.length()); // 결과 : 2000
thread-safe
하므로 멀티스레드 상황에서 StringBuilder보다 속도가 느릴 것 입니다. 왜냐하면, synchronized가 붙어있기 때문에 스레드가 메서드 수행이 끝날때 까지 대기하기 때문이죠.Reference