1. 병렬 처리의 실용적인 활용: Java 코드 예제로 알아보기


  1. 병렬처리의 필요성:

    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.ForkJoinPool;
    
    public class DataProcessor {
        public static void main(String[] args) {
    
            // 대용량 데이터셋 생성
            List<Integer> dataSet = new ArrayList<>();
            for (int i = 0; i < 100; i++) {
                dataSet.add(i);
            }
    
            // ForkJoinPool 객체 생성
            ForkJoinPool forkJoinPool = new ForkJoinPool();
    
            // ForkJoinPool에 병렬 작업 제출
            forkJoinPool.submit(() -> {
                // 병렬 스트림을 사용하여 각 데이터 요소를 처리
                dataSet.parallelStream().forEach(DataProcessor::processData);
            }).join();  // 작업이 완료될 때까지 대기
        }
    
        private static void processData(int data) {
            // 시간이 오래 걸리는 작업을 시뮬레이션
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            // 처리된 데이터 출력
            System.out.println("Processed data: " + data);
        }
    }
    

2. Java의 기초적인 동시성 처리: 스레드 동기화의 ABC


  1. 스레드 동기화

    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class LockExample {
        private final Lock lock = new ReentrantLock();  // Lock 인터페이스의 구현체
        private int count = 0;  // 공유 자원
    
        public void increment() {
            lock.lock();  // 임계 영역에 진입하기 전에 lock을 획득
            try {
                count++;  // 임계 영역
            } finally {
                lock.unlock();  // 임계 영역을 빠져나올 때 lock을 해제
            }
        }
        
        public static void main(String[] args) {
            LockExample example = new LockExample();
    
            Thread t1 = new Thread(() -> {
                for (int i = 0; i < 1000; i++) {
                    example.increment();
                }
            });
    
            Thread t2 = new Thread(() -> {
                for (int i = 0; i < 1000; i++) {
                    example.increment();
                }
            });
    
            t1.start();
            t2.start();
    
            try {
                t1.join();
                t2.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            System.out.println("Final value of count: " + example.count);
        }
    }
    

3. 뮤텍스와 세마포어: Java에서의 동시성 제어 메커니즘


  1. 뮤텍스 (Mutex)