본문 바로가기

프로그램언어/Java

자바 쓰레드 상식

반응형

JAVA Thread

- Thread 를 extend 한 객체는 run() 함수를 override 하여 쓰레드로 실행하고자 하는 로직을 구현할 수 있다.

- 위 객체를 인스턴스화하여 사용하는 함수에서는 start() 함수와 join() 함수를 통해 쓰레드를 시작하고 회수한다.

- 다만 다중 쓰레드에서 같은 변수를 참조하는 경우에 race condition 에 의해 변수 값이 예상과 다를 수 있다.

- 이런 경우에 변수에 접근하는 함수에 synchronized 키워드를 달아서 변수에 대한 lock 을 획득할 수 있다.

- 다만 synchronized 로 선언한 함수에서 loop 이 돌면서 변수를 처리할 때, 함수 전체에 대한 lock 을 얻기보단 변수처리 로직에 대한 lock 을 얻는 것이 현실성이 있다.

- 그럴 때 쓰레드 간 협력 작업을 위한 함수 wait()notify() 를 사용한다.

- 예를들어 변수 처리를 그만해야할 로직에 이르면 wait() 함수로 쓰레드를 Not Runnable 상태로 전환하고, 또 다른 함수에서 해당 조건을 완화했다고 판단이 되면 notify() 함수를 호출하면서 다시 Runnable 한 상태로 되돌릴 수 있다.

- 적절한 예제로 빵을 생산하는 쓰레드와 소모하는 쓰레드를 동시에 실행시키는 것을 참고할 수 있다.

- 출처

 

[JAVA 기본] Thread의 동기화

멀티스레드 프로그래밍을 하다보면 스레드를 동기화 해주어야 한다. 스레드를 동기화 하는 이유는 여러 개의 스레드가 같은 프로세스 내의 자원을 공유하면서 작업하는 경우에 서로의 작업이

kyun2.tistory.com

Springboot Thread

- 스프링부트 프레임워크에서 빈(서비스/컨트롤러 등)은 싱글톤으로 관리되지만 ThreadPool 을 이용하여 다중처리를 지원한다.

- 그래서 싱글톤 객체 안에 멤버 변수를 조작하면 역시나 race condition 이 발생한다.

- 해결 방법으로는 싱글톤 객체 안에 멤버 변수를 사용하지 않거나 Mutex 로직을 포함시킨다.

- 출처

 

SpringBoot는 싱글톤인데 어떻게 다중 요청을 처리할까??

SpringBoot를 학습한 지 얼마 되지 않았을 때 생긴 궁금점이었습니다. Spring은 Bean 객체를 싱글톤으로 관리하는데 어떻게 다중 요청을 처리하는지에 대하여 궁금증이 생겼습니다. Thread에 관한 지식

dingdingmin-back-end-developer.tistory.com

- 예제를 살펴보면 기본적으로 ThreadPool 이 제공하는 쓰레드는 3개다.

반응형