Skip to Content
Suffering builds character
아카이브13.프로세스,스레드특징스레드 특징9. 멀티 스레드 프로그래밍

9. 멀티 스레드 프로그래밍

약 2000년대 초반에는 CPU가 가진 단일 코어(Core)의 성능을 올리는데 한계를 느끼고 코어의 개수를 늘려서 작업 성능을 향상시키고자 하였음

코어의 개수가 늘어난 것은 연산 처리를 수행할 장치가 늘어났다는 것이기 때문에 수행 속도는 빨라졌지만,

개발자에게는 2개 이상의 스레드를 통해 동작할 프로그램을 작성하는 과정에서 스레드들 간에 공유 리소스에 접근하여 발생할 수 있는 스레드 안전성 문제를 고려해야 하는 부담이 생김

이를 멀티 스레드 프로그래밍이라고 함

1. 스레드 안전성 문제를 해결하기 위한 방법

스레드 안전성 문제는 결국 개별 스레드들이 공유 변수에 접근할 때, 공유 영역에 대해 각 스레드들의 동시적인 접근을 방지하여 데이터의 정합성을 유지시킴으로써 해결할 수 있음

이를 동기화 기법이라고 함

2. 동기화 기법

동기화 기법이란, 스레드 내 공유 자원에 대한 동시 접근을 방지하여 데이터의 정합성을 유지시키고, 프로그램이 일관되게 동작하도록 공유 영역에 대한 접근을 제어하기 위한 기법을 말함

2-1. 상호 배제, Mutex(Mutual Exclusion)

상호 배제란 공유 자원에 대한 동시적 접근을 제어하기 위한 대표적인 동기화 기법 중 하나로, 내부적으로는 락(Lock) 메커니즘을 통해 구현됨

Note

락(Lock)

락이란 공유 자원에 접근하는 영역(임계 영역, Critical Section)에 접근하기 위해 일련의 키(key)를 획득한 스레드만이 접근 가능하도록 자바에서 내부적으로 flag 변수 등을 활용하여 제어하는 방식

상호 배제 의사 코드

Lock.java
acquired(lock) // 가장 먼저 접근한 스레드가 락을 획득 critical section // 공유 자원에 접근할 수 있는 영역(임계 영역), 한 시점에서는 하나의 스레드만 접근할 수 있음 release(lock) // 락 해제, 다른 스레드가 접근할 수 있도록 키 반납 ..

3. synchronized 키워드

Java에서는 synchronized 키워드를 통해 Mutex를 간단하게 적용할 수 있음

💡
Tip

고유 락(Intrinsic lock) or 모니터 락(Monitor)

자바의 모든 객체는 고유한 락을 가지고 있으며, 이러한 고유 락은 각 객체(Object)마다 객체 헤더에 해당 인스턴스 및 클래스의 정보를 담고 있음

특정 스레드가 접근하려는 객체의 헤더 내 Lock에 대한 정보를 토대로 객체가 현재 잠겨있는지(locked) 아닌지 확인하여 동기화 처리가 수행됨

만약 객체가 하나의 스레드에 의해 사용되어 잠겨있을 경우, 다른 스레드는 접근이 불가능해짐(blocked)

→ 실습을 통해 확인

Last updated on