Java Spring MVC 프로젝트를 개발 중이며 Java Spring Bean에서 인스턴스 변수를 사용하는 것을 망설이고 있습니다.이 주제에 대해 질문하고 싶습니다.Java Spring Bean의 인스턴스 변수
Java Spring Bean에서 인스턴스 변수를 사용했으며 유형이 String입니다.
private String abc = "hell";
알다시피 Java Spring 기본 범위는 Singleton이며 프로젝트의 시작 시점에 생성됩니다. 이것은 단일 인스턴스이며 내 인스턴스 변수는 스레드로부터 안전해야합니다.
빈의 메소드에서이 변수 "abc"를 사용하고 여러 스레드가이 변수에 도달하면 각 스레드의 데이터 일관성이 손상됩니까?
예를 들어, 스레드 1은 빈에 도달하여 abc 변수를 "hello"로 변경했습니다. 그 시간에 스레드 1 참조가 abc 변수 포인트 "hell"또는 "hello"입니까? 나는이 주제에 대해 혼란스러워한다.
ThreadLocal
개체는 각 스레드가 자신의 abc 변수를 보유하도록 제공합니다. 그러나 나는 ThreadLocal
개체를 사용하여 Tomcat의 메모리 누수가 발생한다는 것을 읽었습니다. Tomcat의 7.0 버전 이후에는 고정되어 있다고합니다 .
각 스레드는 자신의 변수를 보유하고 있기 때문에 작업이 끝나면 container.But에 의해 관리되는 스레드 풀을 반환하므로 풀을 반환하면 ThreadLocal 객체가 파괴되지 않고 메모리 누수가 발생합니다.
또한 String 객체는 이론적 인 관점에서 볼 때 불변이므로 다중 스레드 문제가 발생합니까 ??
각 스레드가 자체적으로 String 변수를 보유하고 있습니까? 예를 들어, 스레드 1 트리거 및 다음 메서드 호출을 시작하고 별도의 문자열 변수 "abc"및 스레드 2 트리거를 만든 다음 새 문자열 변수 "abc"만들고 "abc"변수를 서로 손상합니까?
나는이 사용법의 개념에 대해 정말로 궁금해하고 답을 배우고 싶어합니다.
하나의 메소드에서 ThreadLocal 객체를 사용하며이 메소드는 JSP에 의해 호출됩니다. 메소드의 첫 번째 행은 ThreadLocal 객체 세트의 메소드 매개 변수 값을 취합니다. "하지만 각 요청 후에 상태를 지우는 데 매우주의해야합니다." 나는이 문장을 제공하고 내가 올바르게 이해하면 괜찮았다. 메모리 누출이 발생하면, 나는 ThreadLocal 객체에 대한 서블릿 필터를 작성할 것이다. 맞습니까? –