[JAVA] synchronized 키워드와 락(Lock) 개념

synchronized 키워드

synchronized 키워드는 자바 언어에서 락(Lock)을 사용하기 위한 키워드입니다. 특정 메서드 또는 코드 블록을 synchronized로 선언하면, 해당 메서드 또는 코드 블록을 한 번에 하나의 스레드만 접근할 수 있도록 합니다.

 

synchronized 키워드 예시

public class Example {
    private int count = 0;

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

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

이러한 동기화 방식은 메서드나 코드 블록 전체를 동기화시킴으로써, 동시에 여러 스레드가 해당 코드에 접근하지 못하게 합니다.

 

락(Lock) 개념

락은 다중 스레드 환경에서 공유 데이터에 대한 접근을 조절하기 위해 쓰입니다. 락은 한 번에 하나의 스레드만이 특정 블록을 실행할 수 있도록 보장하여 동기화를 달성합니다.

Lock 인터페이스와 구현체인 리엔트런트 락(ReentrantLock)이 사용됩니다.

 

락(Lock) 예시

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Example {
    private int count = 0;
    private Lock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }

    public int getCount() {
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}

락은 명시적으로 잠금을 설정하고 해제할 수 있으며, try-finally 블록을 사용하여 락이 항상 해제되도록 보장합니다.

 

synchronized와 ReentrantLock 차이점

  1. ReentrantLock은 클래스로 구현된 인터페이스인 Lock 인터페이스를 사용합니다. 반면 synchronized는 키워드로 직접 제어됩니다.
  2. ReentrantLock은 lock() 메서드를 호출하여 잠금을 획득하고 unlock() 메서드를 호출하여 잠금을 해제해야 합니다. 반면 synchronized는 코드 블록이나 메서드의 끝에 도달하면 자동으로 잠금을 해제합니다.
  3. ReentrantLock는 더 많은 제어와 유연성을 제공하지만 사용이 복잡할 수 있습니다. synchronized는 간단하고 사용이 간편하지만, 기능적인 면에서는 ReentrantLock에 비해 제한적입니다. 성능 측면에서는 상황에 따라 ReentrantLock가 더 좋을 수 있지만, 대부분의 경우에는 synchronized로 충분하며 가독성과 사용 편의성을 고려할 때 이를 사용하는 것이 좋습니다.