

여러 작업을 동시에 실행하는 것이 아니라, CPU가 작업마다 시간을 분할해 적절히 Context Switching함으로써 동시에 실행되는 것처럼 보이게 하는 것을 동시성이라고 한다.
동시성은 대개 스레드, 코루틴, 비동기 프로그래밍 등의 방법을 사용하여 구현된다.


논리적인 개념?
- 동시성은 절대적인 시간 관점에서는 동시에 처리되지 않으나, 논리적으로 동시에 실행하는 것처럼 보이게 하므로 논리적 개념이라고 한다.
- 반면 병렬성은 실제-즉 물리적인 시간 상에서 동시에 실행되므로 물리적 개념이다.
여러 쓰레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제를 동시성 문제라고 한다. 동시성 문제는 여러 쓰레드가 같은 인스턴스의 필드에 접근해야 하므로 트래픽이 많을 때 자주 발생하게 된다.
특히 자바의 스프링은 기본적으로 스프링 빈을 싱글톤으로 등록하기 때문에 싱글톤 객체의 필드를 변경하며 사용할 때 이러한 동시성 문제가 생길 수 있다.
동시성 문제는 쓰레드마다 다른 메모리영역이 할당된 지역 변수에서는 발생하지 않고, 주로 같은 인스턴스의 필드에 접근할 때(싱글톤) 또는 static같은 공용 필드에 접근할 때 발생한다.
싱글톤 패턴(Singletone pattern)이란?
- 간단히 말하면 객체의 인스턴스를 하나만 생성되게 하여, 해당 객체를 공유하며 사용하는 디자인 패턴이다. (자세한 내용 참고)
쓰레드 로컬은 해당 쓰레드만 접근할 수 있는 특별한 저장소를 말한다.
자바에서는 java.lang.ThreadLocal을 지원한다.
동시성 문제가 발생하는 필드의 타입을 ThreadLocal<>로 변경하여 사용한다.
단, 주의할 점으로는 해당 쓰레드가 쓰레드 로컬을 모두 사용하고 나면 ThreadLocal.remove()를 호출하여 쓰레드 로컬에 저장된 값을 제거해주어야 한다.
다음 주차에는 스프링에서의 동시성에 대해 더 집중적으로 살펴보고, 레이스 컨디션 및 데드락문제, 해결방안에 대해 살펴볼 예정이다.
출처
https://velog.io/@kwontae1313/동시성과-병렬성의-개념과-차이https://velog.io/@wlsrhkd4023/동시성Concurrency과-병렬성Parallelism-차이
https://shuu.tistory.com/56
https://hstory0208.tistory.com/entry/Spring-%EB%8F%99%EC%8B%9C%EC%84%B1-%EB%AC%B8%EC%A0%9C%EC%99%80-%ED%95%B4%EA%B2%B0-%EC%93%B0%EB%A0%88%EB%93%9C-%EB%A1%9C%EC%BB%AC
https://jeong-pro.tistory.com/93