대용량 처리를 하는 데 있어서 쓰레드를 공부해야 되는 것은 필수라고 생각된다. 해당 사용되는 라이브러리를 먼저 사용하는 것보다 동작 원리를 먼저 파악해야 된다는 것을 인지하고 기초부터 알아보고자 한다.
public class Thread implements Runnable {
// ...
}@FunctionalInterface
public interface Runnable {
public abstract void run();
}
상태
메서드
예시 코드
public class ThreadTest {
@Test
public void test(){
Thread thread = new Thread(() -> {
System.out.println("쓰레드 실행 중...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("쓰레드 종료.");
});
System.out.println("쓰레드 상태 (NEW): " + thread.getState()); // NEW
thread.start();
System.out.println("쓰레드 상태 (RUNNABLE): " + thread.getState()); // RUNNABLE
try {
thread.join(); // 메인 쓰레드가 지정된 스레드의 종료를 기다림
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("쓰레드 상태 (TERMINATED): " + thread.getState()); // TERMINATED
}
}
출력
스레드 상태 (NEW): NEW
스레드 상태 (RUNNABLE): RUNNABLE
스레드 실행 중...
스레드 종료.
스레드 상태 (TERMINATED): TERMINATED
여기서 난 Blocked상태와 Waiting상태가 대체로 비슷한 것 같아 차이점을 정리해 보았다.
Lock을 획득한다는 말이 정확히 무엇인가? 에서 궁금증을 해결하기 위해 정리를 해보았다.
→ 특정 쓰레드가 공유 리소스에 대한 접근 권한을 얻는다는 의미이다. Lock을 획득하는 동안 다른 쓰레드가 공유 리소스를 접근하지 못하고 대기한다.
// 블록 정의
public void myMethod1(){
synchronized (lock) {
// 구현부분
}
}
// 메서드 전체 정의
public synchronized void myMethod2() {
// critical section
}→ synchronized 블록이 커지면 Lock범위가 넓어짐에 따라 그만큼 대기시간도 길어지기 때문에 필요한 만큼 사용해야만 한다.
Java에서 Lock획득에 대해 정의할 때 synchronized 키워드를 사용하게 되는데 기능에 대해서 자세히 정리해보고자 한다.
주요 기능
Synchronized은 Mutex 매커니즘을 사용한다고 알려져있다. 그래서 학부 시절 운영체제 수업에 배웠던 Mutex와 Semaphore의 차이가 궁금했기 때문에 정리해보았다.
주요 차이점은 Mutex는 단일 접근, Semaphore는 다수 접근이다. 그리고 소유권의 유무의 차이가 있다.
동시성에 대해 공부하기 위해 쓰레드의 기본에 대해 정리해 보았다. 생성과 실행은 Thread, Runnable을 사용하고 생명주기는 NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING,TERMINATE의 상태들이 있다. 그리고 쓰레드의 동기화를 위한 수단으로 synchronized 키워드, 관리하는 기법인 Mutex, Semaphore등에 대해서 알아보았다.