[java] 동기화 키워드인 synchronized의 특징은?

Java에서의 synchronized 키워드는 멀티스레딩 환경에서 동시에 여러 스레드가 접근할 수 있는 공유 리소스에 대한 접근을 제어하는데 사용됩니다. synchronized 키워드를 사용하면 한 스레드가 공유 리소스를 사용하는 동안 다른 스레드는 대기 상태로 들어가게 됩니다. 이를 통해 여러 스레드가 동시에 공유 리소스에 접근하는 것을 방지하여 데이터의 일관성을 유지할 수 있습니다.

synchronized 키워드는 다음과 같은 특징을 가지고 있습니다.

  1. 원자성(Atomicity): synchronized 키워드로 감싼 코드 블록은 하나의 원자적인 작업 단위로 간주됩니다. 즉, 하나의 스레드가 synchronized 블록에 진입하면 끝날 때까지 다른 스레드가 이 블록에 접근할 수 없습니다.

  2. 가시성(Visibility): 하나의 스레드가 synchronized 블록에서 데이터를 변경하면, 이 변경 내용은 곧바로 메모리에 반영되어 다른 스레드에게도 즉시 가시적으로 보입니다.

  3. 순서 보장(Ordering): synchronized 키워드로 보호된 공유 리소스에 대한 접근은 순서가 보장됩니다. 즉, 먼저 도달한 스레드가 먼저 synchronized 블록에 진입하고, 끝날 때 까지 다른 스레드들은 대기 상태로 남게 됩니다.

  4. 성능 저하: synchronized 키워드를 사용하면 여러 스레드가 공유 리소스에 동시에 접근하지 못하므로, 성능 저하의 원인이 될 수 있습니다. 그러나 Java에서는 synchronized 키워드를 적절히 사용해야만 데이터의 일관성을 유지할 수 있기 때문에 성능을 희생하는 것이 필요한 경우입니다.

다만, synchronized 키워드는 잘못 사용하면 데드락 등의 문제를 일으킬 수 있으므로 주의가 필요합니다. 따라서 자바 5부터는 synchronized 키워드 대신 더 세밀하게 동기화를 제공하는 Lock 인터페이스와 그 구현체인 ReentrantLock을 사용하는 것이 권장됩니다.

참고 자료: