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 차이점
- ReentrantLock은 클래스로 구현된 인터페이스인 Lock 인터페이스를 사용합니다. 반면 synchronized는 키워드로 직접 제어됩니다.
- ReentrantLock은 lock() 메서드를 호출하여 잠금을 획득하고 unlock() 메서드를 호출하여 잠금을 해제해야 합니다. 반면 synchronized는 코드 블록이나 메서드의 끝에 도달하면 자동으로 잠금을 해제합니다.
- ReentrantLock는 더 많은 제어와 유연성을 제공하지만 사용이 복잡할 수 있습니다. synchronized는 간단하고 사용이 간편하지만, 기능적인 면에서는 ReentrantLock에 비해 제한적입니다. 성능 측면에서는 상황에 따라 ReentrantLock가 더 좋을 수 있지만, 대부분의 경우에는 synchronized로 충분하며 가독성과 사용 편의성을 고려할 때 이를 사용하는 것이 좋습니다.
'JAVA > 스레드' 카테고리의 다른 글
[JAVA] volatile 키워드의 활용 (0) | 2023.09.25 |
---|---|
[JAVA] synchronized와 static synchronized의 차이점(block, method) (0) | 2023.09.25 |
[JAVA] 공유 자원과 경쟁 상태와 임계 영역 (0) | 2023.09.11 |
[JAVA] 스레드 우선순위 설정과 데몬 스레드 (0) | 2023.08.30 |
[JAVA] 스레드의 생성과 실행: Java로 구현하는 방법 (0) | 2023.08.30 |