해결된 질문
작성
·
139
·
수정됨
0
이해 확인에 대한 질문입니다. synchronized는 메서드에서 현재 getBalance()랑 withdraw()에서 선언되었는데, lock은 객체가 가지고있다고 이해하고있습니다. synchronized 메서드가 실행시 lock을 가지고 간다면 synchronized가 선언되지 않은 메서드(동일 클래스)는 자유롭게 실행이 가능한거고,
만약 synchronized withdraw가 스레드1에서 실행중이라면 스레드2가 synchronized getBalance()시 락을 획득할 수 없어서 대기해야하는 것이 맞나요?
2. 제가 스프링 DB2까지 강의를 듣고있는데, 스프링에서는 실제로 WAS의 스레드 풀에서 기본적으로 많은 스레드를 확보해두고 있는 것으로 알고있습니다. 해당 강의들에서 synchronized를 사용해본 기억은 없는 것 같아요. 기본적으로 스프링은 synchronized가 필요한 부분에 구현이 되어있는 걸까요?(싱글톤 빈에 대한 질문입니다!) 아니면 멀티스레드의 측면도 개발자가 직접 테스트하면서 최적화가 필요할까요?(아마 제 예상으로는 개발자가 직접하는 부분도, 스프링이 해주는 부분도 있을 것 같은데...) 스프링 고급편, 부트편이나 JPA 학습 시점에 알 수 있는 부분일까요?
답변 2
1
안녕하세요. 영한노게임님
1번은 생각하신 내용이 맞습니다.
추천하는 방법은 Thread.sleep() 같은 기능을 통해서 대기하도록 코드를 작성해보시면, 더 확실하게 확인하실 수 있을거에요.
감사합니다.
0
2.에 해당하는 것은 다시 생각해보니 이미 강의에서 배운것 같긴 하네요. 이때동안 작성한 코드를 보면 컬렉션을 사용할 때는 실습의 편의상 단순한 컬렉션 구현체들을 사용했지만 실제로는 Concurrent 컬렉션 구현체를 사용해야 한다고 했던 것이 기억나네요. 또 싱글톤 빈을 구성할 때는 공유자원 문제가 없도록 설계해야하고 문제가 되는 것은 보통 필드에 명시된 것들인데 이것들은 보통 autowired로 주입된 싱글톤 빈 객체일 것 같구요. 메서드들에서 쓰이는 변수들이야 쓰레드에 스택에서 활용되는 내부변수이니 공유자원 문제와는 상관없을 것 같네요.
챕터를 마무리하고 다시 씁니다. 필드(멤버변수)에서 사용하는 것이 꼭 autowired로 주입된 싱글톤 객체만 사용하는 것은 아니고 싱글톤 객체에서도 공유변수나 객체의 사용가능성이 존재할 것 같은데 그때는 concurrent 컬렉션을 사용한다던가 해야겠네요. 단순히 int~ 와 같은 기본형을 사용하는 것은 최대한 피해야할 것 같기도 하네요. AtomicInteger를 사용하다던가 해야겠네요. 싱글톤 객체들은 스프링 컨테이너에서 "하나"만 존재하는거고 여러 쓰레드에서 이것을 가져다 쓸테니 적절한 동기화 기법(동기화 강도 - 성능)을 고려하여 사용해야겠네요. 아니면 간단한 변수를 사용해도 그것을 클래스로 다시 덮어서 다루는 메서드들에 동기화 기법을 칠한다던지 해야겠네요.