https://devdebin.tistory.com/335
자바 동기화란?
자바에서 동기화란 멀티스레드 환경에서 여러 스레드가 하나의 공유 자원(예: 변수, 객체 등)에 동시에 접근하지 못하도록 제어하는 기술입니다. 동기화를 통해 데이터의 일관성과 무결성을 보장할 수 있습니다536.
왜 동기화가 필요한가?
-
멀티스레드 환경에서는 여러 스레드가 동시에 같은 데이터를 읽거나 쓸 수 있습니다.
-
이로 인해 데이터 경쟁(race condition), 쓰레드 간섭(thread interference), 메모리 일관성 오류(memory consistency errors) 등이 발생할 수 있습니다356.
-
예를 들어, 은행 계좌에서 입금과 출금이 동시에 일어나면 의도하지 않은 결과가 나올 수 있습니다.
자바 동기화 방법
1. synchronized 키워드
-
자바에서 가장 기본적인 동기화 방법입니다.
-
임계영역(critical section: 공유 자원에 접근하는 코드 영역)에
synchronized키워드를 붙여 한 번에 하나의 스레드만 접근하도록 합니다5378.
synchronized 사용법
| 구분 | 설명 |
|---|---|
| synchronized 메서드 | 메서드 전체에 락을 겁니다. 인스턴스(객체) 단위로 락이 걸립니다. |
| synchronized 블록 | 코드의 특정 블록에만 락을 겁니다. 락을 걸 객체를 지정할 수 있습니다. |
| static synchronized 메서드 | 클래스 단위로 락이 걸립니다. (클래스의 Class 객체에 락) |
| static synchronized 블록 | 클래스 단위로 특정 블록에만 락을 겁니다. |
// 메서드 전체 동기화
public synchronized void increment() {
count++;
}
// 코드 블록 동기화
public void increment() {
synchronized(this) {
count++;
}
}
2. volatile 키워드
3. java.util.concurrent 패키지
-
Lock인터페이스 등 명시적 락(Explicit Lock) 제공. -
더 세밀한 동기화 제어가 필요할 때 사용합니다6.
동기화의 원리
-
자바의 모든 객체는 *모니터 락(Monitor Lock)*을 내장하고 있습니다.
-
synchronized가 붙은 영역에 진입하면 해당 객체의 락을 획득해야 하며, 락을 가진 스레드만 임계영역을 실행할 수 있습니다.
동기화의 단점 및 주의사항
-
성능 저하: 불필요하게 넓은 영역에 동기화를 적용하면, 스레드가 락을 기다리면서 성능이 떨어질 수 있습니다.
-
데드락: 여러 락을 동시에 걸 때, 서로 락을 기다리며 영원히 대기하는 상황이 발생할 수 있습니다.
-
공정성 문제: 일부 스레드가 계속 락을 획득하지 못하는 기아(starvation) 현상이 생길 수 있습니다36.
정리
-
동기화는 멀티스레드 환경에서 공유 자원의 안전한 접근을 보장합니다.
-
자바에서는 주로
synchronized키워드와volatile, 그리고Lock인터페이스 등을 사용합니다.
Citations:
- https://jeong-pro.tistory.com/227
- https://velog.io/@chanyoung1998/%EC%9E%90%EB%B0%94-%EB%8F%99%EA%B8%B0%ED%99%94-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
- https://www.daleseo.com/synchronization/
- https://hamait.tistory.com/229
- https://kadosholy.tistory.com/123
- https://goyunji.tistory.com/183
- https://jgrammer.tistory.com/entry/Java-%ED%98%BC%EB%8F%99%EB%90%98%EB%8A%94-synchronized-%EB%8F%99%EA%B8%B0%ED%99%94-%EC%A0%95%EB%A6%AC
- https://myeongdev.tistory.com/75
- https://babgeuleus.tistory.com/entry/%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C%EC%99%80-%EB%8F%99%EA%B8%B0%ED%99%94-%EB%AC%B8%EC%A0%9C-%EB%B0%B1%EA%B8%B0%EC%84%A0-%EC%9E%90%EB%B0%94%EB%9D%BC%EC%9D%B4%EB%B8%8C%EC%8A%A4%ED%84%B0%EB%94%94
Perplexity로부터의 답변: pplx.ai/share