[Java] 자바 동시성(멀티스레딩)의 개요

2022. 10. 21. 00:11TIL💡/Java

프로세스와 스레드

프로세스: 프로그램 또는 애플리케이션의 실행 인스턴스

스레드: 프로세스의 실행 가능한 가장 작은 (CPU) 작업 단위

자바 스레드는 오버헤드가 상대적으로 낮고 다른 스레드와 공통 메모리 공간을 공유한다.

 

동시성과 병렬성

동시성은 하나의 애플리케이션에서 여러 작업을 관리하는 능력을 의미한다.

프로그램이나 애플리케이션은 한 번에 하나의 작업을 처리(순차 처리)하거나 동시에 여러 작업을 처리(병행 처리)할 수 있다.

 

동시성을 병렬성(Parallelism)과 혼동하면 안된다.

병렬성은 애플리케이션이 서로 다른 개별 작업을 동시에 처리하는 능력이다.

💡 동시성은 많은 일을 한 번에 관리하는 것을 의미하고, 병렬성은 많은 일을 동시에 실행하는 것을 의미한다.

 

동시성은 멀티 스레딩으로 구현할 수 있다. 멀티스레딩은 프로그램이나 애플리케이션이 한 번에 2개 이상의 작업을 처리하고 해당 작업을 동기화할 수 있는 기술을 말한다. 즉, 멀티 스레딩을 사용하면 가상으로 동시에 2개 이상의 작업을 실행하여 CPU를 최대한 활용할 수 있다.

 

여기서 '가상으로'라는 표현을 사용한 이유가 무엇일까?

작업이 동시에 실행되는 것처럼 보이므로 가상으로 동시에 실행된다라고 표현한 것이다.

이는 본질적으로 동시에 실행되는 것이 아니란 뜻이다.

CPU 문맥 교환 또는 운영체제의 시분할 기법을 활용하여 (가상으로) 동시에 실행되는 것처럼 할 수 있다.

즉, CPU 시간은 실행 중인 작업에서 공유되며 각 작업을 일정 시간 동안 실행하도록 스케줄링한다.

따라서 멀티스레딩은 다수의 작업을 CPU에서 나누어 처리하는 멀티태스킹의 핵심이다.

💡 단일 코어 CPU 환경에서 동시성은 구현할 수 있지만, 병렬성은 구현할 수 없다.

 

같은 작업을 실행하기 위해 할당된 일련의 작업 스레드를 스레드 풀이라고 한다.

작업을 완료한 작업 스레드는 풀로 반환된다. 

일반적으로 스레드 풀은 작업 큐로 구현되며, 스레드 풀에 포함된 스레드의 크기에 맞게 크기를 조정한다.

스레드 풀의 크기는 보통 최적의 성능을 내기 위해 CPU 코어 수와 같다.

 

멀티스레드 환경에서 동기화는 lock으로 구현된다.

여러 스레드가 오류나 예측할 수 없는 동작 또는 결과를 일으키지 않고 동일한 리소스에 접근할 수 있다면 안전한 스레드 환경이라고 말할 수 있다.

스레드 안전은 다양한 동기화 기술(예를 들어 자바의 synchronized 예약어)로 구축할 수 있다.