본문 바로가기
IT/java

Java에서의 스레드 동기화

by 뉴코딩맨 2023. 6. 13.
ava에서 멀티스레드 프로그래밍을 할 때, 스레드 간의 동기화는 매우 중요합니다. 여러 스레드가 공유 자원에 동시에 접근하면 예상치 못한 결과가 발생할 수 있습니다. Java에서의 스레드 동기화에 대해 알아보고, 동기화의 개념과 사용법을 설명하겠습니다.
 
 

동기화의 개념

동기화는 여러 스레드가 공유 자원에 접근할 때, 한 스레드의 작업이 완전히 끝나기를 기다렸다가 다른 스레드가 접근하도록 제어하는 메커니즘입니다. 이를 통해 데이터의 일관성과 안정성을 보장할 수 있습니다.
 

synchronized 키워드

Java에서는 synchronized 키워드를 사용하여 동기화를 구현할 수 있습니다. synchronized 키워드를 메소드나 블록 앞에 붙이면, 해당 메소드나 블록을 실행하는 동안은 해당 객체에 대한 잠금(lock)이 설정됩니다. 이는 다른 스레드가 해당 메소드나 블록을 실행할 때, 해당 객체의 잠금이 해제될 때까지 기다려야 함을 의미합니다.
 
 

synchronized 메소드 예시

다음은 synchronized 메소드를 사용하여 스레드 동기화를 구현한 예시입니다.
 
class Counter {
    private int count = 0;

    public synchronized void increment() {
    	count++;
    }

    public synchronized void decrement() {
    	count--;
    }

    public synchronized int getCount() {
    	return count;
    }
}

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

    // 스레드 생성
    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();

    // 모든 스레드의 종료를 기다림
    try {
        thread1.join();
        thread2.join();
    } catch (InterruptedException e) {
    	e.printStackTrace();
    }

    // 결과 출력
    	System.out.println("Count: " + counter.getCount());
    }
}
 
위의 예시에서는 Counter 클래스의 increment()과 decrement() 메소드, 그리고 getCount() 메소드에 synchronized 키워드를 사용하여 스레드 동기화를 구현하고 있습니다. 이를 통해 여러 스레드가 count 변수에 동시에 접근하는 것을 방지하고, 안전하게 값을 증가시키거나 감소시킬 수 있습니다.
 
 

결론

스레드 동기화는 Java에서 멀티스레드 프로그래밍을 할 때 핵심적인 개념입니다. 동기화를 통해 공유 자원에 대한 안전한 접근과 데이터 일관성을 유지할 수 있습니다. synchronized 키워드를 사용하여 동기화를 구현할 수 있으며, 이를 통해 다중 스레드 환경에서 안정적인 프로그램을 개발할 수 있습니다.
 

댓글