동시성·병렬 프로그래밍

동시성·병렬 프로그래밍 (Concurrency)

사용자들은 컴퓨터가 '한 번에 여러 일'을 한다고 당연하게 여겨요. 문서 편집기를 쓰면서도 파일 다운로드가 진행되고, 오디오 앱은 네트워크에서 데이터를 읽으면서 동시에 재생과 화면 갱신을 처리하죠. 자바 플랫폼은 처음부터 동시성(concurrency) 을 지원하도록 설계됐고, 언어 수준의 기본 수단부터 java.util.concurrent의 고수준 API까지 두루 갖추고 있어요. Oracle 공식 튜토리얼의 동시성 레슨은 그 기본기를 하나씩 정리해 줍니다.

출처: Lesson: Concurrency — The Java™ Tutorials

스레드 (Threads)

동시성의 가장 기본 단위는 스레드예요. 자바 프로그램은 시작되면 main 스레드가 돌고, 여기에 더 많은 스레드를 만들어 작업을 나눌 수 있죠. Thread 객체나 Runnable을 이용해 작업을 정의하고 시작하면, 각 스레드가 별도의 실행 흐름을 가지게 돼요. 여러 스레드가 동시에 일하면 성능이 좋아지지만, 그만큼 실행 순서를 예측하기 어려워집니다.

Thread t = new Thread(() -> System.out.println("작업 실행 중"));
t.start();

동기화 (Synchronization)

여러 스레드가 같은 데이터를 동시에 건드리면 예상치 못한 결과가 나올 수 있어요. 이를 막는 게 동기화로, synchronized 블록이나 메서드로 임계 영역을 잠그고, wait/notify로 스레드 간 통신을 조율하죠. 경쟁 상태(race condition), 교착 상태(deadlock) 같은 동시성의 고전적인 문제들을 이해하고 피하는 방법을 배우는 단계예요.

고수준 동시성 API

자바 5.0부터 플랫폼에는 고수준 동시성 API가 추가됐어요. java.util.concurrent 패키지의 Executor/ExecutorService로 작업 실행을 관리하고, ConcurrentHashMap 같은 동시성 컬렉션, AtomicInteger 같은 원자 변수, CountDownLatch·Semaphore 같은 동기화 도구를 조합해 더 안전하고 유연하게 병렬 처리를 구성할 수 있어요. 스레드를 직접 다루는 것보다 추상화 수준이 높아 실무에서 훨씬 자주 쓰입니다.

더 알아보기