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 키워드

  • volatile은 변수의 값을 캐시하지 않고 항상 메인 메모리에서 읽도록 보장합니다.

  • 단, 원자적(atomic) 연산을 보장하지 않기 때문에 완전한 동기화 대안은 아닙니다19.

3. java.util.concurrent 패키지

  • Lock 인터페이스 등 명시적 락(Explicit Lock) 제공.

  • 더 세밀한 동기화 제어가 필요할 때 사용합니다6.

동기화의 원리

  • 자바의 모든 객체는 *모니터 락(Monitor Lock)*을 내장하고 있습니다.

  • synchronized가 붙은 영역에 진입하면 해당 객체의 락을 획득해야 하며, 락을 가진 스레드만 임계영역을 실행할 수 있습니다.

  • 락이 해제되면 대기 중인 다른 스레드가 락을 획득하여 실행합니다356.

동기화의 단점 및 주의사항

  • 성능 저하: 불필요하게 넓은 영역에 동기화를 적용하면, 스레드가 락을 기다리면서 성능이 떨어질 수 있습니다.

  • 데드락: 여러 락을 동시에 걸 때, 서로 락을 기다리며 영원히 대기하는 상황이 발생할 수 있습니다.

  • 공정성 문제: 일부 스레드가 계속 락을 획득하지 못하는 기아(starvation) 현상이 생길 수 있습니다36.

정리

  • 동기화는 멀티스레드 환경에서 공유 자원의 안전한 접근을 보장합니다.

  • 자바에서는 주로 synchronized 키워드와 volatile, 그리고 Lock 인터페이스 등을 사용합니다.

  • 동기화는 반드시 필요한 최소한의 영역에만 적용해야 하며, 데드락 등 부작용에 주의해야 합니다536.

Citations:

  1. https://jeong-pro.tistory.com/227
  2. 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
  3. https://www.daleseo.com/synchronization/
  4. https://hamait.tistory.com/229
  5. https://kadosholy.tistory.com/123
  6. https://goyunji.tistory.com/183
  7. 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
  8. https://myeongdev.tistory.com/75
  9. 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