SeouliteLab

[Java/자바] 동기화 블록(Synchronized Block)의 활용과 이해 본문

프로그래밍

[Java/자바] 동기화 블록(Synchronized Block)의 활용과 이해

Seoulite Lab 2024. 3. 21. 22:01

Java에서는 다중 스레드 환경에서의 동시 접근 문제를 해결하기 위해 동기화 블록인 synchronized block을 제공합니다. 이 블록을 사용하여 특정 코드 영역을 임계 구역으로 설정하여 한 번에 한 스레드만 접근하도록 보장할 수 있습니다. 이번 글에서는 synchronized block을 어떻게 사용하고 이해할 수 있는지 알아보겠습니다.

동기화 블록(Synchronized Block) 설명

동기화 블록의 이해

동기화 블록은 여러 스레드가 공유 자원에 접근할 때 발생하는 경쟁 조건을 해결하기 위해 사용됩니다. synchronized 키워드를 사용하여 특정 객체 또는 클래스에 대한 잠금을 설정하고, 임계 영역으로 설정한 코드 블록을 하나의 스레드만 실행할 수 있도록 합니다.

예제 1: 기본적인 동기화 블록 사용

디렉토리: src/main/java/com/example/synchronization

파일명: SynchronizedBlockExample.java

public class SynchronizedBlockExample {
    private int count = 0;

    // synchronized block 사용
    public void increment() {
        synchronized (this) {
            count++;
            System.out.println("숫자 증가: " + count);
        }
    }
}

예제 2: 다중 스레드에서의 동기화 블록 활용

디렉토리: src/main/java/com/example/synchronization

파일명: Main.java

public class Main {
    public static void main(String[] args) {
        SynchronizedBlockExample example = new SynchronizedBlockExample();

        // 다중 스레드에서 increment 메소드 호출
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                example.increment();
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                example.increment();
            }
        });

        thread1.start();
        thread2.start();
    }
}

예제 3: 여러 객체에 대한 동기화

디렉토리: src/main/java/com/example/synchronization

파일명: MultipleObjectsExample.java

public class MultipleObjectsExample {
    private int count = 0;

    // synchronized block을 사용하여 여러 객체에 대한 동기화
    public void increment() {
        synchronized (this) {
            count++;
            System.out.println("숫자 증가: " + count);
        }
    }
}

예제 4: 스레드 안전성과 동기화

디렉토리: src/main/java/com/example/synchronization

파일명: ThreadSafetyExample.java

public class ThreadSafetyExample {
    private int count = 0;

    // synchronized block을 사용하여 스레드 안전성 보장
    public synchronized void increment() {
        count++;
        System.out.println("숫자 증가: " + count);
    }
}

예제 5: 스레드 안전성과 성능

디렉토리: src/main/java/com/example/synchronization

파일명: PerformanceExample.java

public class PerformanceExample {
    private int count = 0;

    // synchronized block 대신 synchronized 메소드 사용
    public synchronized void increment() {
        count++;
        System.out.println("숫자 증가: " + count);
    }
}