나는 자바 1.6에서 webapp을 작성하고 그것을 tomcat에서 실행한다. 명시 적 스레딩을 수행하지는 않지만 Spring과 Tomcat에서 무엇이 진행되고 있는지 궁금합니다. StringBuffer 대신 StringBuilder를 사용하여 문제가 발생합니까?webapps에 StringBuilder 또는 StringBuffer를 사용해야합니까?
답변
로컬 변수를 사용하는 경우 안전하게 StringBuilder
을 사용할 수 있습니다. 각 스레드는 자체 인스턴스를 가져옵니다.
+1. 그리고 만약 당신이 * 쓰레드간에 문자열을 공유한다면 (예를 들어 정적 필드를 사용하여), StringBuilder * 나 * StringBuffer가 아닌'String'을 사용해야 할 것입니다. – ruakh
ruakh의 요점을 강조하기 위해 스레드간에 불변의 데이터를 전달하는 것이 안전한 방법입니다. –
코드가 서블릿 (doGet/doPost)에 있으면 다중 요청으로 인해 서블릿 인스턴스가 멀티 스레드가됩니다. 코드가 Spring 빈에 있다면, 빈을 싱글 톤이나 프로토 타입으로 설정했는지 여부에 달려있다.
좀 더 정확히 말하면, 서블릿 인스턴스는 다른 클라이언트를 지원하는 여러 스레드가 공유 할 수 있습니다. – Razvan
그 말은 더 좋은 방법입니다. :) –
일반적으로 Java EE 구성 요소는 기본적으로 스레드로부터 안전하지 않으므로 StringBuilder
을 사용하는 코드 블록을 동기화하지 않으면 경쟁 조건이 발생합니다. 따라서 동기화를 처리하거나 StringBuffer
을 사용해야합니다.
물론, StringBuilder
이 로컬 변수 인 경우 이미 언급했듯이 걱정할 필요가 없습니다.
빌더가 doPost 또는 doGet의 로컬 변수이거나 그렇지 않으면 StringBuilder를 사용하십시오. 여러 서버 스레드가 동일한 서블릿 인스턴스를 사용하지만 빌더가 로컬 변수라는 사실은 걱정할 필요가 없습니다! 빌더가 서블릿 클래스의 구성원 인 경우 스레드 안전 문제가 발생합니다. 그건 네 추측이 아니야.
자바 의사는 java.lang.StringBuffer에 대하여 말한다 :이 클래스는 문자열 버퍼에 동기화
동작은 소스 시퀀스를 포함 발생할 때마다 (예를 들면 추기 또는 소스 시퀀스에서 삽입 로) 소스가 아닌 작업을 수행합니다.
즉, 다중 스레드 환경 [웹 응용 프로그램] 인 경우에도 StringBuffer에 대한 작업은 안전합니다. StringBuffer 인스턴스의 안전성은 변수의 범위에 의해 결정됩니다.
가능한 [자바에서 StringBuilder 및 StringBuffer] (http://stackoverflow.com/questions/355089/stringbuilder-and-stringbuffer-in-java) – kosa
@thinksteep이 질문은 어떤 종류의 스레딩 웹 응용 프로그램에서 장면 뒤에서 발생하며 이것이 문자열 작성에 어떻게 영향을 미치는지를 보여줍니다. –
아마도 복제본이 아닙니다. 이것은 StringBuilder/StringBuffer 클래스 자체보다 Tomcat에서의 스레딩에 대한 더 많은 질문 인 것 같습니다. –