JAVA/포스팅

자바 synchronized 제어자

짜집퍼박사(짜박) 2023. 11. 12. 00:14

synchronized 키워드는 자바에서 스레드 간의 동기화를 제어하기 위해 사용되는 제어자입니다. 이를 이용하여 특정 메서드 또는 블록을 임계 영역으로 지정하여 여러 스레드 간에 공유되는 자원에 대한 동시 접근을 제어할 수 있습니다.

 

1. 메서드에 synchronized 적용 예제

public class SynchronizedExample {
    private int count = 0;

    // synchronized 메서드
    public synchronized void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }

    public static void main(String[] args) {
        SynchronizedExample example = new SynchronizedExample();

        // 여러 스레드에서 increment 메서드 호출
        Runnable incrementTask = () -> {
            for (int i = 0; i < 1000; i++) {
                example.increment();
            }
        };

        // 여러 스레드 생성
        Thread thread1 = new Thread(incrementTask);
        Thread thread2 = new Thread(incrementTask);

        // 스레드 시작
        thread1.start();
        thread2.start();

        try {
            // 메인 스레드에서 생성한 스레드들의 종료를 기다림
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 최종 결과 출력
        System.out.println("Count: " + example.getCount());
    }
}

위 예제에서 increment 메서드에 synchronized를 적용하여 여러 스레드에서 이 메서드를 동시에 호출할 때 발생하는 경쟁 조건을 방지하고자 합니다.

 

2. 블록에 synchronized 적용 예제

public class SynchronizedBlockExample {
    private static int count = 0;
    private static Object lock = new Object();

    public static void main(String[] args) {
        // 여러 스레드에서 공유되는 객체
        Runnable incrementTask = () -> {
            synchronized (lock) {
                for (int i = 0; i < 1000; i++) {
                    count++;
                }
            }
        };

        // 여러 스레드 생성
        Thread thread1 = new Thread(incrementTask);
        Thread thread2 = new Thread(incrementTask);

        // 스레드 시작
        thread1.start();
        thread2.start();

        try {
            // 메인 스레드에서 생성한 스레드들의 종료를 기다림
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 최종 결과 출력
        System.out.println("Count: " + count);
    }
}

이 예제에서는 특정 객체(lock 객체)에 대한 synchronized 블록을 사용하여 공유 자원에 대한 동기화를 수행합니다. 이를 통해 임계 영역을 선언적으로 제어할 수 있습니다.

synchronized를 사용할 때 주의할 점은 모든 스레드가 동기화 메서드 또는 블록에 접근하려면 동일한 객체에 대해 동기화를 해야 한다는 것입니다. 따라서 동일한 객체에 대한 동기화를 보장하기 위해 특정 객체를 사용하는 것이 일반적입니다.

 

With ChatGPT

'JAVA > 포스팅' 카테고리의 다른 글

자바 transient 제어자  (0) 2023.11.12
자바 volatile 제어자  (0) 2023.11.12
자바 abstract 제어자  (0) 2023.11.12
자바 static 제어자  (0) 2023.11.12
자바 final 제어자  (0) 2023.11.12