[스터디할래 10] 멀티쓰레드 프로그래밍

이 글은 ‘백기선’ 개발자님과 함께하는 온라인 자바 스터디에 참여하여 준비/학습한 내용을 정리하는 글입니다.📚

정리는 Java Tutorials - Concurrency를 기반으로 하였습니다.

여담_ Thread는 자바의 근간인 만큼 스레드 관련 자바 API DOCS(예 - Enum Thread.State docs) 는 관리가 굉장히 잘 되어 있다. 개발을 하다보면 두 종류의 문서를 만난다: 관리가 잘 된 문서와 그렇지 않은 문서. 관리가 잘 된 문서를 보면 클래스의 기능, 역할이 꼼꼼히 기술되어 있고, 메서드에는 거의 모든 파라미터에 설명이 기술디어 있어 api 사용자가 궁금해할만한 거의 모든 부분을 찾을 수 있다. 이번 자바 api docs 처럼 이렇게 관리가 잘 된 문서를 보면 개발자가 얼마나 사용자를 배려했는지, 자신이 작성한 코드를 얼마나 사랑하는지를 엿볼 수 있어 감동적이다.

프로세스와 스레드

컴퓨터 프로그래밍에서 하나의 코어에서 time slicing 기법을 통해 하나의 프로세스가 나뉘어 실행된다.

프로세스

스레드

Thread 클래스와 Runnable 인터페이스

스레드 정의, 시

  1. Runnable 객체를 제공
    • Runnable 인터페이스를 구현한 객체를 생성한다. 객체의 main 메서드에 실행할 코드를 기술하여 Thread 생성 시 생성자에 넘겨준다.
  2. Thread를 subclassing 한다.
    • Thread 클래스를 상속한 객체를 생성하여 실행 가능한 코드를 run() 메소드에 기술한다.

Runnable 인터페이스

쓰레드의 상태

NEW

RUNNABLE

BLOCKED

Monitor Lock? monitor는 자바의 멀티스레드 환경에서 스레드간 통신을 하기 위한 synchronization, 동기화 방법이 구현된 객체이다. 자바의 객체는 스레드가 lock/unlock을 할 수 있는 monitor를 가지고 있다. 스레드가 객체의 monitor lock을 가진다는 것은 그 객체의 사용권을 가진다고 생각할 수 있다. 하나의 monitor에는 하나의 스레드만 lock 소유권을 가진다. 즉, 하나의 객체는 동시에 하나의 스레드에서만 접근할 수 있다. 내가 접근하고자 하는 객체에 이미 다른 스레드가 monitor lock을 가지고 있다면, 나는 BLOCKED 상태로 기다리는 것이다. (from https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.1) 실제로 같은 객체에 접근하는 두 스레드는, 우리 눈에는 거의 동시에 접근하는 것처럼 보이지만 사실은 교대로 하나씩 접근된다. 누가 얼마나 먼저 접근하고 언제 다른 스레드에게 넘겨줄지는 JVM의 영역이다.

WAITING

TIMED_WAITING

TERMINATED

쓰레드의 우선순위

Main 쓰레드

동기화(Synchronization)

멀티스레드 환경에서의 문제상황

Thread Interference, 스레드 간섭

Memory Consistency Errors, 메모리 불균형

동기화 방법

Synchronized method

Intrinsic Locks(Monitor Lock)

데드락