스프링 싱글톤 콩은 실 안전한가요?
스프링 싱글톤 콩은 실 안전한가요?
스프링 싱글톤 원두가 실 안전한지, 만약 그렇다면, 왜, 아니면 왜?
저는 봄이 초보라서 도움을 주시면 감사하겠습니다.
아니요. 두 개념은 연관성도 없습니다.
싱글턴은 창조에 관한 것입니다.이 설계 패턴을 사용하면 클래스의 인스턴스 하나만 생성됩니다.
스레드 안전은 실행에 관한 것입니다.위키백과 인용하기:
코드 조각은 여러 스레드에 의해 동시에 안전하게 실행되도록 보장하는 방식으로 공유 데이터 구조만 조작하는 경우 스레드 안전합니다.
결국 스레드 안전은 코드와 코드에만 의존합니다.그리고 이것이 봄콩이 실로 안전하지 않은 이유입니다.
나는 다른 인식을 가지고 있습니다: 봄 싱글톤 콩은 한 번만 만들어지고 어느 시점에서나 한 번만 사용할 수 있습니다.
비동기화 방식으로 수정된 인스턴스 변수가 있다고 가정해 보겠습니다.다중 스레드 환경에서는 모든 스레드에 동일한 클래스 인스턴스가 할당되고 2개의 동시 스레드가 인스턴스 변수를 업데이트/변경할 수 있으므로 예기치 않은 상황이 발생할 수 있습니다.싱글톤 콩은 실 안전성을 제공하지 않으며 인스턴스 변수 사용이 예상치 못한 결과를 초래할 수 있음을 알고 있으므로 동일한 문제를 해결할 수 있는 두 가지 옵션이 있습니다.
- 다중 스레드 환경에서는 인스턴스 변수를 사용하지 마십시오. 또는
- 인스턴스 변수를 수정할 때마다 메서드에 동기화된 블록/키워드를 사용하여 예기치 않은 결과를 방지합니다.
스프링은 싱글톤 콩의 라이프 사이클을 관리하고 개체의 단일 인스턴스를 유지합니다.나사산 안전은 아무 상관이 없습니다.
그렇지 않다면 왜죠?
싱글톤과 실 안전성은 서로 다른 개념이기 때문입니다.동기화된 키워드로 스레드 안전을 도모할 수 있습니다.
스프링 싱글톤 콩은 스프링이 그것들을 인스턴스화한다고 해서 실 안전하지 않습니다.미안하다.
싱글톤 빈스는 실 안전 여부는 싱글톤의 범위가 되는 클래스가 어떻게 쓰이는지에 따라 달라집니다.각 호출 스레드는 고유한 실행을 가지며 모든 호출 스레드가 공유하는 싱글톤 범위 클래스에 일부 코드가 있지 않는 한 다른 스레드의 실행을 방해하지 않습니다.g 클래스가 메서드에 의해 액세스되는 변수를 전역적으로 선언하고 값이 수정된 경우 동시성 문제가 발생할 수 있으므로 클래스 수준이 아닌 메서드 수준에 해당 변수를 두는 것이 좋습니다.
스프링 싱글톤 빈 정의 단일 인스턴스는 스프링 IOC 컨테이너에서 BeanAwareFactory에 의해 생성됩니다.그러나 여러 스레드에서 동일한 빈을 사용하려고 하면 동시 액세스로 인해 스레드 안전이 되지 않아 예기치 않은 동작이 발생할 수 있습니다.
Singleton은 IOC 컨테이너에 개체 인스턴스를 만드는 것입니다.따라서 여러 스레드를 실행할 때는 런타임 동작에 대한 것입니다.
그리고 동일한 객체의 값은 여러 개의 스레드에 접근할 때 제한이 없기 때문에 두 스레드 모두에서 수행할 수 있습니다.
아니요, 스프링 싱글톤 콩은 실 안전하지 않습니다. 여기 예가 있습니다.
public class Emmloyee {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
그리고 여기.applicationContext.xml
<bean id="emp" class="com.manikant.Emmloyee" p:id="26" p:name="Manikant Gautam">
그리고 여기 시험수업이 있습니다.
public class Test {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("com/manikant/config.xml");
Emmloyee emp=(Emmloyee)ctx.getBean("emp");
System.out.println("User "+emp.getName() + " is of age "+emp.getId());
emp.setName("Changed value");
Emmloyee emp1=(Emmloyee)ctx.getBean("emp");
System.out.println("User "+emp1.getName() + " is of age "+emp1.getId());
}
}
출력입니다.
User Manikant Gautam is of age 26
User Changed name is of age 26
변화를 보다value
타고emp.setName("Changed value");
딴 생각을 하다bean emp1
또한.
제 견해에 따르면 싱글톤 클래스의 안전성은 전적으로 싱글톤 클래스의 설계/작성 여부에 달려있다고 합니다.
싱글톤 클래스에 정의된 전역 변수가 있으면 여러 스레드가 싱글톤 개체를 공유하고 전역 변수를 업데이트할 수 있는 메서드를 실행하면 스레드가 안전하지 않기 때문에 스레드가 안전하지 않습니다.
싱글톤 클래스 스레드를 안전하게 만들려면 해당 클래스를 상태 비저장 상태로 만드는 것이 싱글톤 클래스에서 전역 변수를 정의하는 것을 피해야 합니다.
봄이 실을 안전하게 해주는 것은 아닙니다.그건 당신의 책임입니다. 스프링은 싱글턴을 만들겠지만, 만약 그것이 변형된다면, 그것은 안전하지 않을 수도 있습니다.스프링 콩 클래스가 스레드 세이프가 되어야 하는 방식으로 관리하는 것은 프로그래머의 책임입니다.
봄에는 싱글톤 콩에 상태가 없습니다.싱글톤 빈 스코프는 BeanFactory당 단일 인스턴스를 보장합니다.따라서 다중 스레드 환경에서는 단일 톤 빈 스코프로도 단일 인스턴스를 보장할 수 없습니다.
따라서 이를 해결하기 위해서는 개발자가 스레드 안전성을 확보해야 하는 책임이 있기 때문에 Bean 스코프를 싱글톤 스코프에서 프로토타입 스코프로 변경해야 합니다.
병렬 처리를 사용하여 업스트림에서 서비스를 호출했는데 애플리케이션이 다운되었습니다.스레드 1이 bean A를 작업하는 동안 다른 요청이 들어왔고 bean A의 몇 가지 파라미터를 설정했습니다.내 bean A가 데이터베이스에 저장되었을 때, 나는 그것이 완전히 엉망임을 확인했습니다.시제품으로 고쳤습니다.
그렇지 않다면 왜죠?
싱글톤에서 thread이 아닌 안전한 물체에 대한 참조를 가질 수 있기 때문입니다.
하지만 그렇지 않은 경우 스프링을 사용하여 인스턴스 변수를 주입하면 예, 스레드 안전합니다.
언급URL : https://stackoverflow.com/questions/17342850/are-spring-singleton-beans-thread-safe