[Java] Java에서의 동기화 기법 #1 synchronized 활용

smallcherry's techlog·2022년 5월 17일
0

Java

목록 보기
10/10

1. Java의 "synchronized"에 대해

Java 동기화 기법을 만나보기에 앞서, 동기화라는 개념의 등장 배경과 필요한 이유에 대해 먼저 간단히 알아보려 한다.

동기화는 multi thread 혹은 multi process 환경에서 스레드 혹은 프로세스 간 공유 및 수정이 가능한 자원을 다룰 때, 자원의 안정성 및 신뢰성 보장을 위해 각 스레드 혹은 프로세스가 접근 가능한 공동 자원의 sync (싱크)를 맞춰주는 작업 이다.

이러한 동기화의 대표적인 매커니즘은 상호배제를 통해 이루어지고, 시스템에서 상호배제를 구현한 기법은 크게 Mutex와 Semaphore가 있다.

  • Mutex(뮤텍스): multi thread 환경에서의 상호배제 기법. 1개의 자원에 대한 접근 제한을 강제함
  • Semaphore(세마포어): multi thread 혹은 multi process 환경의 상호배제 기법. 다수의 스레드 혹은 프로세스가 n개의 공유자원에 대한 접근 제한을 강제함. wait&signal 연산으로 이를 제어하나, wait&signal 연산이 프로그램 전체에 구성되어 있으면 세마포어의 영향이 미치는 곳이 어딘지 파악하기 어렵기 때문에 세마포어를 사용하여 프로그램을 구현하기 어렵다는 한계가 있음.

Java에서는 위 세마포어의 한계를 극복하여 구현한 Monitor를 제공하게 되고 (프로그래밍 언어 수준에서 제공), Java의 모든 인스턴스는 Object내부에 구현된 Monitor를 가지고 있다. 그래서 모든 인스턴스는 Monitor를 통해 스레드 동기화를 수행할 수 있게 된다.

동기화가 필요한 메서드나 멤버변수에 synchronized 키워드를 붙여주게 되면 Monitor를 활용하여 Java 내부적으로 상호배제가 이루어지게 된다!

👉 요약

Java에서는 동기화 기법으로 상호배제(보완된 세마포어)를 구현한 Monitor를 Object 내부에 구현하여 모든 인스턴스에 Thread 동기화가 가능하게 하고, 이 Monitor를 활용하여 메서드나 멤버변수를 구현할 수 있는 키워드가 바로 synchronized 이다.

2. 적용 예시

탭이 5개까지만 열리는 브라우저 (CLI)
Reference의 블로그의 코드를 보고 작성하였다.

https://github.com/YunHye-Choi/Java_SkillUp/tree/main/src/com/synchronizedproject

3. Reference

https://tecoble.techcourse.co.kr/post/2021-10-23-java-synchronize/

profile
Java Developer

0개의 댓글