본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

JAVA

synchronized 를 이용한 스레드의 동기화

스레드의 동기화란.

한 스레드가 특정작업을 끝마치기 전까지 다른 스레드에 의해 방해받지 않도록 하는것.

자바에서는 synchronized블럭을 이용해서 스레드의 동기화를 지원했지만

jsk1.5부터 java.util.concurrent,locks와 java.util.concurrent,atomic패키지를 통해 다양한 방식의 동기화가 가능하다.

 

예시에서 `Counter` 클래스의 
`increment` 메서드와 `decrement` 메서드는 
`synchronized` 키워드를 사용하여 동기화된다.

이를 통해 
여러 스레드가 동시에 `increment` 또는 `decrement` 메서드를 호출할 때, 
스레드 간 경쟁이 발생하지 않고 안전하게 카운터 값을 조작할 수 있다.

class Counter {
    private int count = 0;

    // synchronized 키워드를 사용하여 메서드를 동기화합니다.
    public synchronized void increment() {
        count++;
    }

    // synchronized 블록을 사용하여 특정 부분을 동기화합니다.
    public void decrement() {
        synchronized (this) {
            count--;
        }
    }

    public int getCount() {
        return count;
    }
}
public class SynchronizedExample {
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();

        // 여러 스레드에서 increment 메서드를 호출하면서 카운터를 증가시킵니다.
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.decrement();
            }
        });

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

        thread1.join();
        thread2.join();

        // 모든 스레드가 종료된 후에 최종 카운터 값을 출력합니다.
        System.out.println("Counter value: " + counter.getCount());
        //Counter value: 12
        //스레드 스케줄링에 따라 increment()와 decrement()가 번갈아가며 실행되므로 최종 카운터 값은 예측하기 어렵다.
    }
}