1권 110쪽에 나오는 내용인데 싱글턴으로 했을때 멀티쓰레드의 문제점 입니다.
이게 @Bean으로 컨테이너에 등록해서 사용해서 싱글턴으로 하나만 사용되고, Read전용이면 상관없고, 변경이 자주되는 User같은경우 멀티 쓰레드에서 사용했을경우 A가 저장하고 값 받아올때 B가저장하면 B의 값을 가져오는 오류가 생긴다 까지는 이해 했는데
2번은 지역멤버를 만들어서 매개변수로 리턴해주고
3번은 지역멤버 없이 그냥 하는건데
질문 1-사진 3번으로 실행한 경우) 빈으로는 아래 두개 메서드만 등록 해놓고 컨테이너에서 UserDao의 get()함수를 사용했을때 User user = new User(); 했는데 이 user도 컨테이너에 등록돼서 싱글턴으로 사용되는거임? ->난 아니라고 생각해서 그 컴퓨터마다 new 하면 user는 개인컴퓨터마다 다른 변수로 선언되는거 아닌가요?
질문 2)3번 사진 ㅡ> 2번사진으로 하면 해결된다는거임?
1. 컨테이너에 등록 안되지.. 컴퓨터마다라기 보다는 메서드 호출할때마다 새로운 객체가 만들어지는거임 2. 동시성 문제가 해결되냐는거?? 오히려 동시성 문제가 생기면 생겼지 왜 해결된다는 거지?
아~~ 감사합니다 생각이 정리돼서 이해됐습니다!
1. userDAO가 싱글턴 2. user가 인스턴스 변수로 선언되어있으면(사진 2) A가 인스턴스 변수 user에 new User하고 set ~~했을 때 B가 중간에 다시 new User()하면 싹 다 날아감 3. 3번처럼 메서드 내부의 로컬변수로 선언하면 바뀔 일 없음 따라서 2번-> 3번으로 해야 해결된다 아님? 김대기 나와주세요
아 이해됐어요 감사합니다! 이걸 반대로 이해 하고있었네요 하하하하
UserDao만 싱글턴이고 User는 Bean이랑 관련 없는 일반 객체네 애초에 UserDao가 팩토리 빈도 아닌데 거기서 생성한게 빈이 될 이유가 없잖아?
2번 사진은 잘못된 사용법이고 3번이 맞지
2번 사진대로 하면, 싱글턴인 UserDao의 get 메서드가 여러 스레드에서 호출되는데, 타이밍 이슈로 잘못된 값이 반환될 수 있음
아 이해됐어요 감사합니다! 이게 Ioc비슷하게 자꾸 이상한곳에서 호출해서 헷갈렸어요 감사합니다 전 UserDao에서 딸려가서 같이 등록되는줄 알았어요 감사하빈다
문득 생각난건데 DAO는 반드시 싱글턴이어야될 이유가 있음? connectionMaker는 풀 관리하는거라 치면 싱글턴이 맞는거 같은데 DAO 싱글턴이어야할어떤 이유가 있나해서 안 쓸 이유가 없으니까 써도되는건가?
매번 조회할때마다 생성하고 버리고 하면 리소스를 너무 많이 잡아먹어서 그런가