[java] 유닉스/리눅스 시스템 호출을 사용하여 프로세스 간 동기화를 수행하는 방법에 대해 알려주세요.
뮤텍스(mutex)
뮤텍스는 상호배타적 락(mutual exclusion lock)을 위한 동기화 메커니즘으로, 임계 구역(critical section)에 대한 접근을 제어합니다. 리눅스 시스템 호출 중 하나인 pthread_mutex_lock
및 pthread_mutex_unlock
함수를 사용하여 뮤텍스를 생성하고 제어합니다. Java에서는 java.util.concurrent.locks.Lock
인터페이스 및 java.util.concurrent.locks.ReentrantLock
클래스를 사용하여 뮤텍스를 구현할 수 있습니다.
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MutexExample {
private final Lock lock = new ReentrantLock();
public void performTask() {
lock.lock();
try {
// 임계 구역에 대한 작업 수행
} finally {
lock.unlock();
}
}
}
세마포어(semaphore)
세마포어는 동기화 및 신호 전달(synchronization and signaling)을 위한 카운팅 세마포어로, 특정 리소스의 접근을 제어합니다. 리눅스 시스템 호출 중 하나인 sem_wait
및 sem_post
함수를 사용하여 세마포어를 생성하고 조작할 수 있습니다. Java에서는 java.util.concurrent.Semaphore
클래스를 사용하여 세마포어를 구현할 수 있습니다.
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
private final Semaphore semaphore = new Semaphore(1);
public void performTask() throws InterruptedException {
semaphore.acquire();
try {
// 리소스에 대한 작업 수행
} finally {
semaphore.release();
}
}
}
위의 예제에서는 뮤텍스와 세마포어를 각각 Java에서 구현하는 방법을 보여줍니다. 두 동기화 메커니즘은 공유 리소스에 대한 안전한 액세스 및 프로세스 간 통신을 가능하게 합니다.
참고 문헌:
- https://man7.org/linux/man-pages/man3/pthread_mutex_lock.3.html
- https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html
- https://man7.org/linux/man-pages/man3/sem_wait.3.html
- https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Semaphore.html