목차
- 자바 소스 코드 컴파일 명령 javac 예제 이전 포스팅
- 자바 스레드 생성 및 간단한 처리 예제 이전 포스
- 자바 정수 변수 선언 및 카운팅 증가시키기 예제 이전 포스팅
- 자바 Lock, Unlock 으로 변수 접근 동기화 예제
- 출력 결과
자바 소스 코드 컴파일 명령 javac 예제 이전 포스팅
오늘 다룰 주제는 스레드간 공유 변수를 접근할 때 동시에 접속하면 발생되는 데드락 혹은 레이싱 컨디션 문제를 해결하는 방법입니다. 이를 해결하기 위해서는 Lock, Unlock 을 적절히 사용하며 공유 변수에 대한 접근을 1개의 스레드만 접근할 수 있도록 해야합니다. 오늘 예제의 실행 결과를 확인하기 위해 javac 명령을 통해 소스 코드를 컴파일하겠습니다. 아직 컴파일 방법을 모르신다면 아래 이전 포스팅 링크를 참고하여 학습해주세요.
2023.08.10 - [Linux] - [Linux/Java] 리눅스 우분투에서 java 컴파일 및 실행 예제(javac)
자바 스레드 생성 및 간단한 처리 예제 이전 포스팅
아래는 이전 포스팅에서 다뤘던 자바에서 스레드를 생성하여 처리하는 예제입니다. 다른 언어들에서도 스레드를 지원하지만 오늘 예제는 자바에서 스레드를 활용한 예제이기 때문에 자바의 스레드 생성 방법을 학습해주세요.
2023.08.16 - [Java] - [Java/Linux] thread 생성 및 병렬처리 예제(Runnable)
자바 정수 변수 선언 및 카운팅 증가시키기 예제 이전 포스팅
마지막으로 2개의 스레드가 서로 같은 카운트 변수를 접근하는 예제이기 때문에 자바에서 정수 변수(int)를 선언하고 사용하는 방법에 대해 알아야합니다. 아직 자바에서 정수 선언 및 사용방법을 모르신다면 아래 링크를 통해 학습해주세요.
2023.08.11 - [Java] - [Java/Linux] int, String 등 변수 크기 및 선언 예제
자바 Lock, Unlock 으로 변수 접근 동기화 예제
아래는 자바에서 ReentrantLock의 Lock 메소드를 통해 공유 변수에 대해 접근을 차단하고 UnLock 메소드를 접근을 할 수 있도록 허용시키는 예제입니다.
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Example {
private static int count = 0;
private static Lock lock = new ReentrantLock();
public static void main(String[] args) {
Runnable incrementTask = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
lock.lock();
try {
count++;
System.out.println(Thread.currentThread().getName() + ": Count = " + count);
} finally {
lock.unlock();
}
}
}
};
Thread thread1 = new Thread(incrementTask, "Thread 1");
Thread thread2 = new Thread(incrementTask, "Thread 2");
thread1.start();
thread2.start();
}
}
출력 결과
아래는 위 예제를 실행하고 나온 결과입니다. 2개의 스레드가 하나의 공유 변수에 접근하여 카운팅을 수행하지만 순서대로 꼬임없이 카운팅이 증가하여 출력되는 것을 알 수 있습니다.