>Java >java지도 시간 >Java 싱글톤 모드의 스레드 안전 문제에 대한 솔루션

Java 싱글톤 모드의 스레드 안전 문제에 대한 솔루션

黄舟
黄舟원래의
2017-09-15 10:36:301656검색

이 글은 주로 Java 싱글턴 모드 스레드 안전 문제에 대한 관련 정보를 소개합니다. 이 글을 통해 모든 사람이 싱글턴 모드의 스레드 안전 사용을 이해하고 숙달할 수 있기를 바랍니다.

Java 싱글턴 모드 스레드 안전 문제

SpringIOC 컨테이너는 싱글톤 모드에서 기본적으로 Bean 액세스 범위를 제공합니다. 즉, 전체 애플리케이션 수명 주기에는 인스턴스가 하나만 있습니다. 따라서 다중 스레드 동시성에서는 스레드 안전 위험이 있습니다. MVC 프레임워크의 서블릿은 스레드로부터 안전합니다. 서블릿이 클라이언트 측에 있기 때문에 동시성이 상대적으로 적지만, 웹 서비스 측에서는 이를 고려해야 합니다.

ThreadLocal 클래스: 각 스레드에 대한 변수(인스턴스)의 독립적인 복사본을 제공하고 각각의 다른 인스턴스에서 격리에 액세스합니다.
동기화 잠금 메커니즘에서 후발 스레드는 멤버 변수에 액세스하기 전에 이전 스레드가 완료될 때까지 기다립니다. ThreadLocal은 인스턴스 복제를 구현하고 객체 액세스 데이터 충돌을 격리합니다. 동시에 프로토타입 액세스 모드에서 대량 인스턴스의 라이프사이클 관리에 대한 소량의 소비와 부담도 해결할 수 있습니다. 그것은 "시간과 공간의 교환"과 "공간과 시간의 교환"의 두 가지 실현입니다. 전자는 액세스를 위해 대기할 서로 다른 스레드에 대한 고유 변수만 제공하는 반면, 후자는 각 스레드에 대한 복사본을 제공하므로 서로 영향을 주지 않고 동시에 액세스할 수 있습니다. 서버 리소스 소비를 줄이기 위해 인스턴스를 다시 생성하지 않습니다.

일반적으로 다중 스레드 환경에서는 상태 비저장 Bean만 공유할 수 있다는 것을 알고 있습니다. Spring에서는 대부분의 Bean을 싱글톤 범위로 선언할 수 있습니다. 이는 Spring이 ThreadLocal을 사용하여 일부 Bean(예: RequestContextHolder, TransactionSynchronizationManager, LocaleContextHolder 등)에서 스레드로부터 안전하지 않은 상태를 처리하여 이를 스레드로부터 안전하게 만들기 때문입니다. Stateful Bean은 여러 스레드 간에 공유될 수 있기 때문입니다.

스레드 안전 문제: 전역 변수 및 정적 변수로 인해 발생합니다. 각 스레드에 전역 변수 및 정적 변수에 대한 읽기 작업만 있고 쓰기 작업은 없는 경우 일반적으로 이 전역 변수는 스레드로부터 안전합니다. 스레드가 동시에 쓰기 작업을 수행하는 경우 일반적으로 스레드 동기화를 고려해야 합니다. 그렇지 않으면 스레드 안전성이 영향을 받을 수 있습니다.

1) 상수는 항상 스레드로부터 안전합니다(상수 값).
2) 각 메서드 호출 전에 새 인스턴스를 생성하는 것은 스레드로부터 안전합니다. (다른 인스턴스는 서로 격리됨)
3) 로컬 변수는 스레드로부터 안전합니다(격리됨)

메서드가 실행될 때마다 로컬 변수는 독립적인 공간에 생성되며 공유 리소스가 아닙니다. 지역 변수에는 메소드 매개변수 변수와 메소드 내부 변수가 포함됩니다.

상태: 데이터 저장 및 변경 기능 포함. 인스턴스 변수가 있는 객체인 Stateful Bean은 데이터를 저장할 수 있지만 스레드로부터 안전하지 않습니다.

상태 비저장: 일회성 작업이며 데이터를 변경할 수 없습니다. 인스턴스 변수가 없는 객체인 Stateless 객체(Stateless Bean)는 데이터를 저장할 수 없고 불변 클래스이며 스레드로부터 안전합니다. 봄에는 성능 향상을 위해 싱글톤 모드를 공유 인스턴스로 사용합니다. Stateful Bean은 다중 스레드 환경에서 안전하지 않으므로 Prototype 프로토타입 모드가 적합합니다. 프로토타입: Bean에 대한 각 요청은 새로운 Bean 인스턴스를 생성합니다.

위 내용은 Java 싱글톤 모드의 스레드 안전 문제에 대한 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.