언제 StringBuilder 또는 StringBuffer를 사용해야합니까?


13

프로덕션 웹 응용 프로그램에서 동료 프로그래머는 StringBuffer를 모든 곳에서 사용했습니다. 이제 응용 프로그램 개발 및 수정을 관리하고 있습니다. StringBuilderStringBuffer를 읽은 후에 는 데이터 bean에 스레드 안전성이 필요하지 않기 때문에 모든 StringBuffer 코드를 StringBuilder로 대체하기로 결정했습니다.

예를 들면 : (각 데이터 bean에서 StringBuffer의 사용을 볼 수 있습니다)

@Override
public String toString() {
    StringBuffer sb = new StringBuffer();// replace it from StringBuilder
    sb.append(" ABCD : ").append(abcd);
    sb.append(", EFGH : ").append(efgh);
    sb.append(", IJKL : ").append(ijkl);
}

각 세션 / 요청에 대해 별도의 데이터 bean을 작성합니다. 세션은 다른 사용자가 액세스 할 수없는 단일 사용자가 사용합니다.

마이그레이션하기 전에 다른 사항을 고려해야합니까?

단일 스레드가있는 경우 (대기 스레드가 없거나 새 스레드가 객체 잠금을 찾지 않음) StringBuffer 또는 StringBuilder와 동일하게 수행됩니다. StringBuffer의 경우 객체 잠금을 수행하는 데 시간이 걸리지 만 객체 잠금의 보류 / 해제를 제외하고 성능 차이가 있는지 알고 싶습니다.


9
sb예제와 같이 로컬 변수로 사용하면 스레드 안전성은 전혀 중요하지 않습니다. 수천 개의 스레드가 동시에 메소드에 들어간 경우에도 각각 고유 한 로컬 변수가있는 고유 한 호출 스택이 있습니다. StringBuilders는 서로를 방해하지 않습니다.
fredoverflow 오전

나는 항상 누가 인터페이스와 같은 두 개의 스레드를 동기화하려고하는지 궁금했습니다 StringBuffer. 나는 그런 코드를 본 적이 없지만 멀티 스레딩 관점에서 나쁜 디자인이라고 확신합니다. StringBuffer인터페이스를 따라 스레드를 동기화 하는 것은 나쁜 생각이라고 생각하기 때문에이 클래스는 존재하지 않아야하며 항상 사용해야한다고 생각합니다 StringBuilder. 다른 사람들이 이미 언급했듯이 StringBuffer역사적 이유로 존재합니다.
pasztorpisti

답변:


22

이 둘의 유일한 차이점은 StringBuffer에서 사용되는 동기화입니다. 동기화의 오버 헤드는 대단한 계획에서는 크지 않지만 StringBuilder 메서드가없는 경우에는 중요합니다. JVM은 특별히 수행 할 필요가없는 작업, 특히 하나의 스레드 만 수행하고 있습니다.

코드가 작동하고 사람들이 성능에 대해 불평하지 않는다면 걱정하지 않아도됩니다. 당신은 당신의 벅에 많은 강타를하지 않을 것입니다. 그러나 새 코드를 작성하거나 StringBuffer를 사용하는 코드를 업데이트하는 경우 동시에 StringBuilder를 변환하는 것이 좋습니다.


이것에 추가하여 두 가지의 스레드 안전을 염두에 두어야합니다. StringBuilder는 스레드로부터 안전하지 않습니다.
Martijn Verburg

2
@MartijnVerburg True, stackoverflow.com/questions/6775016/stringbuffer-is-obsolete/ 에서 지적되었지만 동일한 문자열 빌더 인스턴스를 사용하기 위해 여러 스레드가 필요한 사용 사례는 거의 없습니다.
Matthew Flynn

4
@MartijnVerburg는 : 또한 주목해야한다 : 경우에 당신이 정말 다음 스레드 안전을 필요로 기회가이 StringBuffer중 하나는 충분하지 않습니다! 그것은 제동을 보장하지는 않지만 여러 스레드가 한 번에 액세스하면 추가하는 위치를 쉽게 제어 할 수 없으므로 다른 외부 동기화가 필요합니다.
Joachim Sauer

8

StringBuilder는 더 빠르고 빠른 StringBuffer가되기 위해 한 지점 (Java 1.5)에 추가되었으며 컴파일러는 후드에서이를 사용하여 +연산자를 Strings에 구현합니다 .

즉, StringBuilder를 사용하면 클래스를 도입했을 때보 다 오래된 JVM에서 코드를 실행할 수 없습니다. 이것은 아직 우리에게 문제가 될 것입니다. 항상 최신 버전을 실행하면 신경 쓸 필요가 없습니다.

다음과 같은 이유로 최적화 과정을 거치지 않겠습니다.

  • 타이트한 루프 외부에서는 이점이 무시할 만합니다. 프로파일 러에서 명시 적으로 핫스팟으로 표시되지 않는 한 귀찮게하지 않습니다.
  • 코드를 변경하면 오류가 발생할 수 있으므로 응용 프로그램을 철저히 다시 테스트해야합니다. 동기화되지 않은 설정에서 동기화 된 클래스를 사용하는 것보다 훨씬 비쌉니다.

나는 당신에 동의합니다 .. 아직도 당신의 요점을 이해할 수 없습니다Outside tight loops the advantage is negligible...
Satish Pandey

StringBuffer와 달리 StringBuilder에서 누락 된 메커니즘은 스레드 보안을위한 거래 속도입니다. 그것은 할 경우에만 문제 때문에 그 속도 향상은 매우 작은 많은 이 일반적으로 여러 번 수행되는 작은 루프의 경우 - 시간을.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.