2012-08-23 5 views
5

나는 자바 1.6에서 webapp을 작성하고 그것을 tomcat에서 실행한다. 명시 적 스레딩을 수행하지는 않지만 Spring과 Tomcat에서 무엇이 진행되고 있는지 궁금합니다. StringBuffer 대신 StringBuilder를 사용하여 문제가 발생합니까?webapps에 StringBuilder 또는 StringBuffer를 사용해야합니까?

+0

가능한 [자바에서 StringBuilder 및 StringBuffer] (http://stackoverflow.com/questions/355089/stringbuilder-and-stringbuffer-in-java) – kosa

+0

@thinksteep이 질문은 어떤 종류의 스레딩 웹 응용 프로그램에서 장면 뒤에서 발생하며 이것이 문자열 작성에 어떻게 영향을 미치는지를 보여줍니다. –

+4

아마도 복제본이 아닙니다. 이것은 StringBuilder/StringBuffer 클래스 자체보다 Tomcat에서의 스레딩에 대한 더 많은 질문 인 것 같습니다. –

답변

10

로컬 변수를 사용하는 경우 안전하게 StringBuilder을 사용할 수 있습니다. 각 스레드는 자체 인스턴스를 가져옵니다.

+4

+1. 그리고 만약 당신이 * 쓰레드간에 문자열을 공유한다면 (예를 들어 정적 필드를 사용하여), StringBuilder * 나 * StringBuffer가 아닌'String'을 사용해야 할 것입니다. – ruakh

+3

ruakh의 요점을 강조하기 위해 스레드간에 불변의 데이터를 전달하는 것이 안전한 방법입니다. –

0

코드가 서블릿 (doGet/doPost)에 있으면 다중 요청으로 인해 서블릿 인스턴스가 멀티 스레드가됩니다. 코드가 Spring 빈에 있다면, 빈을 싱글 톤이나 프로토 타입으로 설정했는지 여부에 달려있다.

+0

좀 더 정확히 말하면, 서블릿 인스턴스는 다른 클라이언트를 지원하는 여러 스레드가 공유 할 수 있습니다. – Razvan

+0

그 말은 더 좋은 방법입니다. :) –

1

일반적으로 Java EE 구성 요소는 기본적으로 스레드로부터 안전하지 않으므로 StringBuilder을 사용하는 코드 블록을 동기화하지 않으면 경쟁 조건이 발생합니다. 따라서 동기화를 처리하거나 StringBuffer을 사용해야합니다.

물론, StringBuilder이 로컬 변수 인 경우 이미 언급했듯이 걱정할 필요가 없습니다.

0

빌더가 doPost 또는 doGet의 로컬 변수이거나 그렇지 않으면 StringBuilder를 사용하십시오. 여러 서버 스레드가 동일한 서블릿 인스턴스를 사용하지만 빌더가 로컬 변수라는 사실은 걱정할 필요가 없습니다! 빌더가 서블릿 클래스의 구성원 인 경우 스레드 안전 문제가 발생합니다. 그건 네 추측이 아니야.

0

자바 의사는 java.lang.StringBuffer에 대하여 말한다 :이 클래스는 문자열 버퍼에 동기화

동작은 소스 시퀀스를 포함 발생할 때마다 (예를 들면 추기 또는 소스 시퀀스에서 삽입 로) 소스가 아닌 작업을 수행합니다.

즉, 다중 스레드 환경 [웹 응용 프로그램] 인 경우에도 StringBuffer에 대한 작업은 안전합니다. StringBuffer 인스턴스의 안전성은 변수의 범위에 의해 결정됩니다.