Spring의 싱글톤 패턴은 스레드로부터 안전합니까?

1. 스프링 싱글톤 모드는 스레드로부터 안전하지 않습니다.

        Spring에서는 싱글톤이 기본 범위이며 동일한 컨테이너에서 Bean에 대한 모든 요청은 동일한 인스턴스를 반환합니다. Spring의 싱글톤 Bean은 여러 스레드가 동시에 액세스할 때 동시성 문제가 있을 수 있으므로 스레드로부터 안전하지 않습니다 .

2. Spring 싱글톤 빈의 스레드 안전성을 어떻게 보장하나요?

(1) Bean의 범위 변경

        Bean의 범위를 프로토타입 으로 변경하면 Bean을 얻을 때마다 새 인스턴스가 반환되도록 보장할 수 있으므로 여러 스레드 간에 Bean 인스턴스를 공유하는 문제를 피할 수 있습니다. 구체적인 방법은 Bean 클래스의 @Bean 주석에 @scope("prototype")를 사용하여 Bean의 범위를 지정하는 것입니다.

(2) 스레드 안전 동기화 메커니즘(잠금)

        상태를 공유해야 하는 일부 Bean의 경우 동기화 메커니즘을 사용하여 공유 상태를 보호하고 여러 스레드가 동일한 Bean 인스턴스의 상태를 동시에 수정하는 것을 방지할 수 있습니다. 일반적으로 동기화, 재진입 잠금 또는 잠금 개체와 같은 키워드는 공유 상태 코드에 대한 액세스를 동기화하는 데 사용 됩니다.

(3) ThreadLocal 사용

        특정 Bean 클래스의 일부만 동기화해야 하는 경우 Qingxiu 수준에서 Threadlocal에 대한 "상태" 정보의 이 부분을 제거하는 것을 고려할 수 있습니다. 그러면 각 스레드는 서로 상태를 공유하는 문제를 피하기 위해 자체 복사본을 갖게 됩니다. 다중 스레드.

(4) 동시 컬렉션 클래스 사용

        Java 동시성 패키지는 ConcurrentHashMap, CopyOnWriteArrayList 등과 같은 스레드로부터 안전한 여러 Concurrent 클래스를 제공합니다. 이러한 클래스는 멀티스레딩에서 정확성을 보장하기 위해 내부적으로 다양한 동기화 메커니즘을 구현합니다. 따라서 다중 스레드 환경에서 공유 Bean을 처리할 때 이러한 스레드 안전 클래스를 사용하여 일반 컬렉션 클래스를 대체할 수 있으므로 여러 스레드가 동일한 Bean 인스턴스에 액세스할 때 발생하는 동시성 문제를 피할 수 있습니다.

추천

출처blog.csdn.net/weixin_71921932/article/details/131084318